簡體   English   中英

在調用onDestroy()之后,我的數據庫刪除了所有行

[英]My database deletes all rows after onDestroy() is called

我正在實現內容提供者的抽象方法“插入”,以從在線源填充數據庫。

我可以使用內容提供程序很好地運行查詢,但是當我從內存中清除應用程序並重新啟動時,內容提供程序查詢將返回空,因為數據庫似乎為空。

這是我的摘要插入...

@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();

在日志中... onPause()和onStop()報告數據庫查詢中的11行。 我的Log.d沒有顯示在onDestroy()中。

當我從內存中清除程序並重新啟動時,代碼再次返回零行。 數據庫為空。

似乎您每次調用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);
}

什么是交易管理機制? 您使用手動交易還是自動交易?

如果您使用人工交易,即使用語句“ BEGIN TRANSACTION”,請確保您的代碼末尾帶有“ COMMIT”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM