我正在实现内容提供商的抽象方法“insert”,以从在线源填充我的数据库。
我可以很好地使用内容提供程序运行查询,但是当我从内存中清除应用程序并重新启动时,内容提供程序查询返回空,因为数据库似乎是空的。
这是我的摘要插入…
@Override
public Uri insert(Uri uri, ContentValues contentValues) {
if(!contentValues.containsKey("_id")) {
// produce UUID
contentValues.put("_id", UUID.randomUUID().toString());
}
long rtrn = db.insertWithOnConflict(DatabaseHelper.DATABASE_TABLE, null, contentValues, SQLiteDatabase.CONFLICT_REPLACE);
String query = "SELECT _id, name, favourite FROM recipe";
Cursor cursor = db.rawQuery(query, null);
Log.d("D", "running cursor.getCount(): "+cursor.getCount());
cursor.close();
getContext().getContentResolver().notifyChange(uri, null);
return uri;
}
logcat显示正在运行的游标计数与insertwith返回的“rtrn”行索引相同。所以数据输入成功。
但是在我的片段里…
SQLiteDatabase db = new DatabaseHelper(context).getWritableDatabase();
String query = "SELECT _id, name, favourite FROM recipe";
Cursor cursor = db.rawQuery(query, null);
Log.d("D", "getCount(): "+cursor.getCount());
cursor.close();
…调用ondestroy()并重新启动应用程序后,它将报告一个空数据库。
如何使数据库内容保持不变?数据在那里而我没有正确访问它吗?如何在应用程序调用ondestroy()并重新启动后访问数据库?
我在onpause()和onstop()以及ondestroy()中运行了以下调试代码。
Cursor cursor = this.getActivity().getContentResolver().query(uri, null, null, null, null);
Log.d("D", "Big getCount(): "+cursor.getCount());
cursor.close();
在Logcat…
onpause()和onstop()报告来自数据库查询的11行。我的log.d没有显示在ondestroy()中。
当我从内存中清除程序并重新启动时,代码再次返回零行。数据库为空。
最佳答案
看起来每次调用oncreate时都在重新创建数据库。
数据提供程序:
public boolean onCreate() {
db = new DatabaseHelper(getContext()).getWritableDatabase();
return false;
}
数据库帮助程序:
private static final String DATABASE_CREATE =
"create table recipe (_id char(36) primary key, name text null, instructions text null, favourite tinyint not null default 0, sync tinyint not null default 0, del tinyint not null default 0);";
@Override
public void onCreate(SQLiteDatabase db) {
Log.d("D", "creating database!");
db.execSQL(DATABASE_CREATE);
}