我的数据库在调用onDestroy()后删除所有行

时间:2015-08-10 03:07:17

标签: java android sql database android-cursorloader

我正在实现内容提供商的抽象方法“插入”以从在线资源填充我的数据库。

我可以使用内容提供程序运行查询,但是当我从内存中清除应用程序并重新启动时,内容提供程序查询将返回空,因为数据库似乎为空。

这是我的抽象插页......

@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()中显示。

当我从内存中清除程序并重新启动时,代码再次返回零行。数据库是空的。

2 个答案:

答案 0 :(得分:0)

每次调用onCreate时,您实际上都在重新创建数据库。 DataProvider的:

public boolean onCreate() {
      db = new DatabaseHelper(getContext()).getWritableDatabase();
      return false;
    }

DatabaseHelper:

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);
}

答案 1 :(得分:0)

什么是交易管理机制? 您是使用手动交易还是自动交易?

如果您使用手动交易,即使用声明" BEGIN TRANSACTION",请确保您的代码具有" COMMIT"最后。