Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 调用onDestroy()后,我的数据库将删除所有行_Java_Android_Sql_Database_Android Cursorloader - Fatal编程技术网

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

Java 调用onDestroy()后,我的数据库将删除所有行,java,android,sql,database,android-cursorloader,Java,Android,Sql,Database,Android Cursorloader,我正在实现内容提供者的抽象方法“insert”,以从在线来源填充我的数据库 我可以使用内容提供商运行查询,但当我从内存中清除应用程序并重新启动时,内容提供商查询返回空,因为数据库似乎为空 这是我的摘要插入 @Override public Uri insert(Uri uri, ContentValues contentValues) { if(!contentValues.containsKey("_id")) { // produce UUID contentValues

我正在实现内容提供者的抽象方法“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()中运行了以下调试代码

在日志中。。。 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);
}

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


如果使用手动事务,即使用语句“BEGIN TRANSACTION”,请确保代码末尾有一个“COMMIT”。

DatabaseHelper中的onCreate方法仅在创建数据库时调用一次。只有当数据库被完全擦除时,才会再次调用它。我在logcats中见过这种行为。你是说碎片吗?是的,当我添加一个片段时,我使用BeginTransaction和commit。
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);
}