我很困惑,我能够从数据库中看到信息,但是,我注意到log.cat
中显示了一个错误代码同样,带有getReadableDatabase
的页面也很好。但对于getWritableDatabase
,它会断裂。
1342-1342/com.package/SQLiteDatabase﹕ Failed to open database 'data/data/com.package/databases/'
android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14):Could not open database
=================================================================================
public Database(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
DATABASE_PATH = "data/data/com.package/databases/";
db = getWritableDatabase();
}
@Override
public synchronized SQLiteDatabase getWritableDatabase() {
try {
if (db != null) {
if (db.isOpen()) {
return db;
}
}
return SQLiteDatabase.openDatabase(DATABASE_PATH, null, SQLiteDatabase.OPEN_READWRITE | SQLiteDatabase.NO_LOCALIZED_COLLATORS);
} catch (Exception e) {
return null;
}
}
下面是我的一个示例方法,展示了它通常是如何工作的:
private SQLiteDatabase db;
public String getDbPath() {
return db.getPath();
}
@Override
public void onCreate(SQLiteDatabase db) {
try {
db.execSQL(CREATE_DB);
}
catch (SQLException e) {
if (Constant.DEBUG)
Log.e(TAG, e.toString());
}
}
public void writeInDb(String sql) {
if (db == null || !db.isOpen())
db = getWritableDatabase();
try {
db.execSQL(sql);
}
catch (SQLException e) {
if (Constant.DEBUG)
Log.e(TAG, e.toString());
}
}
也没有必要硬化db路径,最好使用:
db.getPath();
数据库自动创建在Databases
文件夹
我编辑了我的帖子并添加了答案,但只是为了方便阅读
这是我的答案
只是将实际的数据库名称添加到路径的末尾,在我的例子中是
DATABASE_NAME = database.sqlite
所以我把这个改成
public Database(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
DATABASE_PATH = "data/data/com.package/databases/";
db = getWritableDatabase();
}
到这个
public Database(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
DATABASE_PATH = "data/data/com.package/databases/database.sqlite";
db = getWritableDatabase();
}