【问题标题】:Android Environment.getExternalStorageDirectory() not work?Android Environment.getExternalStorageDirectory() 不起作用?
【发布时间】:2014-08-12 19:14:35
【问题描述】:

这是我之前的代码

private static final String ROOTPATH = "/data/data/";

我想将其更改为使用环境:

私有静态最终字符串 ROOTPATH = Environment.getExternalStorageDirectory()+"/";

但我得到了这个结果:

> 08-12 10:53:09.131: E/SQLiteDatabase(1051):
> android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error
> (code 14): Could not open database 08-12 10:53:09.131:
> E/SQLiteDatabase(1051):   at
> android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
> 08-12 10:53:09.131: E/SQLiteDatabase(1051):   at
> android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:209)
> 08-12 10:53:09.131: E/SQLiteDatabase(1051):   at
> android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193)
> 08-12 10:53:09.131: E/SQLiteDatabase(1051):   at
> android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
> 08-12 10:53:09.131: E/SQLiteDatabase(1051):   at
> android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
> 08-12 10:53:09.131: E/SQLiteDatabase(1051):   at
> android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
> 08-12 10:53:09.131: E/SQLiteDatabase(1051):   at
> android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:804)
> 08-12 10:53:09.131: E/SQLiteDatabase(1051):   at
> android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789)
> 08-12 10:53:09.131: E/SQLiteDatabase(1051):   at
> android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)
> 08-12 10:53:09.131: E/SQLiteDatabase(1051):   at
> android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:669)

这是我的工作: ........... ........

private static final String ROOTPATH = Environment.getExternalStorageDirectory()+"/";
private static final String DB_NAME_INDBNAME    = "database.jpg";
private static final String DB_NAME_OUTDBNAME   = "database.db";

...... 
public synchronized static NOLDatabaseHelper getInstance(Context context) {
    if(dbHelper == null) {
         dbHelper = new NOLDatabaseHelper(context);
    }

    return dbHelper;
}


private NOLDatabaseHelper(Context context) {
    super(context, DB_NAME_OUTDBNAME, null, DB_VERSION);
    this.context = context;
}


public void createDatabase() {
    if(!isDatabaseExited()) 
    {
        Log.v(GlobalConfig.TAG, "NO database");
        getReadableDatabase();
        copyDataBaseFromAsset();
    } else {
        Log.v(GlobalConfig.TAG, "Has database");
    }
}


private boolean isDatabaseExited() {
    SQLiteDatabase checkDB = null;
    try {
        checkDB = SQLiteDatabase.openDatabase( ROOTPATH + DB_NAME_OUTDBNAME, null,
                SQLiteDatabase.OPEN_READONLY);
        checkDB.close();
    } catch (SQLiteException e) {}
    return checkDB != null ? true : false;
}


private synchronized void copyDataBaseFromAsset() 
{
    int length                  = -1;
    byte[] buffer               = new byte[1024];
    AssetManager am             = context.getAssets();

    try 
    {
        InputStream assetsDB    = am.open(DB_NAME_INDBNAME);
        String outFileName      = ROOTPATH + DB_NAME_OUTDBNAME;
        OutputStream dbOut      = new FileOutputStream(outFileName);

        while ((length = assetsDB.read(buffer)) > 0) {
            dbOut.write(buffer, 0, length);
        }

        dbOut.flush();
        dbOut.close();
        assetsDB.close();

    } catch(Exception e) {
        Log.e( GlobalConfig.TAG, "copyDataBaseFromAsset error, is say: "+e.toString() );
    }
}

createDatabase() 是从外部使用 getInstance() 调用的。是否有任何错误或缺失的代码?我应该如何解决这个问题?

非常感谢~!

【问题讨论】:

  • 你有没有在AndroidManifest.xml中添加这个权限?
  • 是的,我加了~但是还是有这个问题
  • use SQLiteAssetHelper 为您的应用打包数据库。
  • 谢谢你的帮助,我会努力的~

标签: android


【解决方案1】:

改变

 super(context, DB_NAME_OUTDBNAME, null, DB_VERSION);

 super(context, ROOTPATH + DB_NAME_OUTDBNAME, null, DB_VERSION);

在您的 NOLDatabaseHelper 构造函数中并将 ROOTPATH 更改为

ROOTPATH = Environment.getExternalStorageDirectory().getAbsolutePath()+"/";

【讨论】:

  • 有人可以建议如何改进这个答案吗?
  • 嗨,我试过这个并解决了这个问题,但我想知道 Environment.getExternalStorageDirectory() 和 Environment.getExternalStorageDirectory().getAbsolutePath() 有什么区别
  • Environment.getExternalStorageDirectory() 为您提供外部存储文件,Environment.getExternalStorageDirectory().getAbsolutePath() 为您提供该文件的路径。
  • 感谢您的帮助!还有一件事,如果用户卸载了 SD 卡,在这种情况下我应该使用哪个环境路径?我应该使用 getDataDirectory() 吗?
  • getFilesDir() 为您的应用提供内部存储路径
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 2016-06-24
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 2021-07-02
相关资源
最近更新 更多