Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.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 在android pie中重新启动应用程序时,在sqlite中输入的数据会自动删除_Java_Android_Sqlite_Android 9.0 Pie - Fatal编程技术网

Java 在android pie中重新启动应用程序时,在sqlite中输入的数据会自动删除

Java 在android pie中重新启动应用程序时,在sqlite中输入的数据会自动删除,java,android,sqlite,android-9.0-pie,Java,Android,Sqlite,Android 9.0 Pie,在android pie中重新启动应用程序后,SQLite数据消失。其他版本的应用程序工作正常,但在android pie中,当您重新启动应用程序时,最后几个条目不可见。数据库并非如其他条目所示完全为空 我曾尝试通过禁用writeaheadloging将WAL模式设置为false,这在某些设备上似乎有效,但问题并未完全解决,因为某些设备仍在报告问题,因此我尝试将PRAGMA journal模式设置为TRUNCATE,但这也不起作用 public myDbHelper(Context conte

在android pie中重新启动应用程序后,SQLite数据消失。其他版本的应用程序工作正常,但在android pie中,当您重新启动应用程序时,最后几个条目不可见。数据库并非如其他条目所示完全为空

我曾尝试通过禁用writeaheadloging将WAL模式设置为false,这在某些设备上似乎有效,但问题并未完全解决,因为某些设备仍在报告问题,因此我尝试将PRAGMA journal模式设置为TRUNCATE,但这也不起作用

 public myDbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
 @Override
    public void onConfigure(SQLiteDatabase db) {
        super.onConfigure(db);
        db.disableWriteAheadLogging();

      Cursor c1=db.rawQuery("PRAGMA journal_mode=TRUNCATE",null);
      c1.close();
    }


    public static synchronized myDbHelper getInstance(Context context) {


        if (mInstance == null) {
            mInstance = new myDbHelper(context.getApplicationContext());
         mInstance.setWriteAheadLoggingEnabled(false);
        }
        return mInstance;
    }
然后在我的片段中: myDbHelper dbHelper=myDbHelper.getInstance(getActivity())


我没有收到任何错误消息,只是最后的几个条目没有显示出来,好像它们没有保存在数据库中一样。非常感谢您的帮助。

我不认为问题是由于WAL模式是否打开直接造成的,而是您可能没有正确确定最后的几个条目

编码
minInstance.setWriteAheadLoggingEnabled(假)将在调用配置本身之前直接关闭WAL(见下文)

我要做的第一件事就是改变

public myDbHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
致:-

以确保您不会无意中获得myDBHelper的rouge实例

作为临时措施,您可能还希望将以下方法添加到myDBHeleper类中:-

public void logMode(SQLiteDatabase db, String tagextra, String dbname, Context context) {
    Log.d("BUILD","Build is " + Build.VERSION.SDK_INT);
    File dbf = new File(context.getDatabasePath(dbname).toString());
    File dbfwal = new File(dbf.getPath() + "-wal");
    File dbfshm = new File(dbf.getPath() + "-shm");
    if (dbfwal.exists()) {
        Log.d("-WALCHK " + tagextra,"The -wal file was found an is " + String.valueOf(dbfwal.length()));
    } else {
        Log.d("-WALCHK " + tagextra,"The -wal file doesn't exist.");
    }
    if (dbfshm.exists()) {
        Log.d("-SHMCHK " + tagextra,"The -shm file was found an is " + String.valueOf(dbfwal.length()));
    } else {
        Log.d("-SHMCHK " + tagextra,"The -shm file doesn't exist");
    }
    if (db == null) {
        db = this.getWritableDatabase();
    }
    Cursor csr = db.rawQuery("PRAGMA journal_mode",null);
    if (csr.moveToFirst()) {
        Log.d("LOGMODE " + tagextra ,"Database mode is " + csr.getString(0));
    }
}
然后可以使用它来确定模式是否存在,以及-wal和-shm文件是否存在并具有任何数据

简言之,它可以用来减轻人们对该问题是由WAL模式引起的任何担忧

例如,使用myDatabaseHelper类的以下近似值。但是,除了您的代码之外:-

  • 上述logMode方法的调用已包含在相关点
  • onCreateMethod用于创建表和添加初始行
  • 构造函数已被设置为私有
所以它看起来像:-

public class myDbHelper extends SQLiteOpenHelper {

    public static final String DATABASE_NAME = "mydb";
    public static final int DATABASE_VERSION = 1;

    public static final String TBL_USER = "user";
    public static final String COL_USER_ID = BaseColumns._ID;
    public static final String COl_USER_NAME = "_name";
    public static final String COL_USER_EMAIL = "_email";
    public static final String COl_USER_PASSWORD = "_password";

    private static myDbHelper mInstance;
    private Context mContext;

    private myDbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        mContext = context;
        logMode(this.getWritableDatabase(),"CONSTRUCT",DATABASE_NAME,context); // Note will force an open
    }
    @Override
    public void onConfigure(SQLiteDatabase db) {
        logMode(db, "ONCONFIG1", DATABASE_NAME,mContext);
        super.onConfigure(db);
        db.disableWriteAheadLogging();
        logMode(db,"ONCONFIG2",DATABASE_NAME,mContext);
        Cursor c1=db.rawQuery("PRAGMA journal_mode=TRUNCATE",null);
        c1.close();
        logMode(db,"ONCONFIG3",DATABASE_NAME,mContext);
    }


    public static synchronized myDbHelper getInstance(Context context) {

        if (mInstance == null) {
            mInstance = new myDbHelper(context.getApplicationContext());
            mInstance.setWriteAheadLoggingEnabled(false);
        }
        mInstance.logMode(mInstance.getWritableDatabase(),"INSTANCE",mInstance.getDatabaseName(),context );
        return mInstance;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        logMode(db,"ONCREATE1",DATABASE_NAME,mContext);
        db.execSQL("CREATE TABLE IF NOT EXISTS " + TBL_USER +
                "(" +
                COL_USER_ID + " INTEGER PRIMARY KEY," +
                COl_USER_NAME + " TEXT UNIQUE," +
                COL_USER_EMAIL + " TEXT," +
                COl_USER_PASSWORD + " TEXT" +
                ")");
        //Add a row when oncreate is called
        db.execSQL("INSERT INTO " + TBL_USER + " (" +
                COl_USER_NAME + "," +
                COL_USER_EMAIL + "," +
                COl_USER_PASSWORD +
                ") VALUES('testuser','testuser@mail.com','1234567890')");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

    public long addUser(String name, String email, String passowrd) {
        ContentValues cv = new ContentValues();
        cv.put(COl_USER_NAME,name);
        cv.put(COL_USER_EMAIL,email);
        cv.put(COl_USER_PASSWORD,passowrd);
        SQLiteDatabase db = this.getWritableDatabase();
        logMode(db,"ADDUSER1",DATABASE_NAME,mContext);
        return db.insert(TBL_USER,null,cv);
    }

    public void logMode(SQLiteDatabase db, String tagextra, String dbname, Context context) {
        Log.d("BUILD","Build is " + Build.VERSION.SDK_INT);
        File dbf = new File(context.getDatabasePath(dbname).toString());
        File dbfwal = new File(dbf.getPath() + "-wal");
        File dbfshm = new File(dbf.getPath() + "-shm");
        if (dbfwal.exists()) {
            Log.d("-WALCHK " + tagextra,"The -wal file was found an is " + String.valueOf(dbfwal.length()));
        } else {
            Log.d("-WALCHK " + tagextra,"The -wal file doesn't exist.");
        }
        if (dbfshm.exists()) {
            Log.d("-SHMCHK " + tagextra,"The -shm file was found an is " + String.valueOf(dbfwal.length()));
        } else {
            Log.d("-SHMCHK " + tagextra,"The -shm file doesn't exist");
        }
        if (db == null) {
            db = this.getWritableDatabase();
        }
        Cursor csr = db.rawQuery("PRAGMA journal_mode",null);
        if (csr.moveToFirst()) {
            Log.d("LOGMODE " + tagextra ,"Database mode is " + csr.getString(0));
        }
    }
}
以下是片段的onStart方法:-

@Override
public void onStart() {
    super.onStart();
    myDbHelper dbHelper = myDbHelper.getInstance(getActivity());
    dbHelper.logMode(dbHelper.getWritableDatabase(),"FRGONSTRT1",myDbHelper.DATABASE_NAME,getActivity());
    dbHelper.addUser("Fred","fred@fredmail.com","password");
    Cursor csr = dbHelper.getReadableDatabase().query(myDbHelper.TBL_USER,null,null,null,null,null,null);
    DatabaseUtils.dumpCursor(csr);
    csr.close();
}
就是这样:-

  • 获取myDBHelper实例
  • 调用logMode方法
  • 添加一行
  • 将所有数据提取到游标中并转储游标
  • 测试 测试1 在具有API 28的Android(仿真器)上卸载应用程序并运行会导致:-

    2019-07-07 10:38:56.022 D/BUILD: Build is 28
    2019-07-07 10:38:56.022 D/-WALCHK ONCONFIG1: The -wal file was found an is 16512
    2019-07-07 10:38:56.022 D/-SHMCHK ONCONFIG1: The -shm file was found an is 16512
    2019-07-07 10:38:56.023 D/LOGMODE ONCONFIG1: Database mode is wal
    2019-07-07 10:38:56.038 D/BUILD: Build is 28
    2019-07-07 10:38:56.038 D/-WALCHK ONCONFIG2: The -wal file doesn't exist.
    2019-07-07 10:38:56.038 D/-SHMCHK ONCONFIG2: The -shm file doesn't exist
    2019-07-07 10:38:56.039 D/LOGMODE ONCONFIG2: Database mode is truncate
    2019-07-07 10:38:56.039 D/BUILD: Build is 28
    2019-07-07 10:38:56.039 D/-WALCHK ONCONFIG3: The -wal file doesn't exist.
    2019-07-07 10:38:56.039 D/-SHMCHK ONCONFIG3: The -shm file doesn't exist
    2019-07-07 10:38:56.040 D/LOGMODE ONCONFIG3: Database mode is truncate
    2019-07-07 10:38:56.041 D/BUILD: Build is 28
    2019-07-07 10:38:56.042 D/-WALCHK ONCREATE1: The -wal file doesn't exist.
    2019-07-07 10:38:56.043 D/-SHMCHK ONCREATE1: The -shm file doesn't exist
    2019-07-07 10:38:56.043 D/LOGMODE ONCREATE1: Database mode is truncate
    2019-07-07 10:38:56.054 D/BUILD: Build is 28
    2019-07-07 10:38:56.054 D/-WALCHK CONSTRUCT: The -wal file doesn't exist.
    2019-07-07 10:38:56.055 D/-SHMCHK CONSTRUCT: The -shm file doesn't exist
    2019-07-07 10:38:56.055 D/LOGMODE CONSTRUCT: Database mode is truncate
    2019-07-07 10:38:56.056 D/BUILD: Build is 28
    2019-07-07 10:38:56.057 D/-WALCHK INSTANCE: The -wal file doesn't exist.
    2019-07-07 10:38:56.057 D/-SHMCHK INSTANCE: The -shm file doesn't exist
    2019-07-07 10:38:56.058 D/LOGMODE INSTANCE: Database mode is truncate
    2019-07-07 10:38:56.058 D/BUILD: Build is 28
    2019-07-07 10:38:56.058 D/-WALCHK FRGONSTRT1: The -wal file doesn't exist.
    2019-07-07 10:38:56.058 D/-SHMCHK FRGONSTRT1: The -shm file doesn't exist
    2019-07-07 10:38:56.059 D/LOGMODE FRGONSTRT1: Database mode is truncate
    2019-07-07 10:38:56.059 D/BUILD: Build is 28
    2019-07-07 10:38:56.059 D/-WALCHK ADDUSER1: The -wal file doesn't exist.
    2019-07-07 10:38:56.059 D/-SHMCHK ADDUSER1: The -shm file doesn't exist
    2019-07-07 10:38:56.060 D/LOGMODE ADDUSER1: Database mode is truncate
    2019-07-07 10:38:56.069 I/System.out: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@4f533b6
    2019-07-07 10:38:56.070 I/System.out: 0 {
    2019-07-07 10:38:56.070 I/System.out:    _id=1
    2019-07-07 10:38:56.070 I/System.out:    _name=testuser
    2019-07-07 10:38:56.070 I/System.out:    _email=testuser@mail.com
    2019-07-07 10:38:56.070 I/System.out:    _password=1234567890
    2019-07-07 10:38:56.070 I/System.out: }
    2019-07-07 10:38:56.070 I/System.out: 1 {
    2019-07-07 10:38:56.070 I/System.out:    _id=2
    2019-07-07 10:38:56.070 I/System.out:    _name=Fred
    2019-07-07 10:38:56.070 I/System.out:    _email=fred@fredmail.com
    2019-07-07 10:38:56.070 I/System.out:    _password=password
    2019-07-07 10:38:56.070 I/System.out: }
    2019-07-07 10:38:56.070 I/System.out: <<<<<
    
    以前被调用过

    mInstance.setWriteAheadLoggingEnabled(false);
    
    数据库最初处于WAL模式,但行
    db.disablewriteaheadloging()将模式更改为截断并在执行此操作时提交事务(由于-wal文件的大小大于0,(-shm基本上是-wal文件的副本),因此在-wal文件中存在未完成的事务),具体如下:-

    2019-07-07 10:38:56.022 D/-WALCHK ONCONFIG1: The -wal file was found an is 16512
    
    事务已提交,因为在所有后续输出中,-wal文件已被删除

    测试2 重新运行应用程序(即现在使用现有数据)时,输出为:-

    2019-07-07 10:52:11.722 I/InstantRun: starting instant run server: is main process
    2019-07-07 10:52:11.812 D/BUILD: Build is 28
    2019-07-07 10:52:11.812 D/-WALCHK ONCONFIG1: The -wal file was found an is 0
    2019-07-07 10:52:11.812 D/-SHMCHK ONCONFIG1: The -shm file was found an is 0
    2019-07-07 10:52:11.813 D/LOGMODE ONCONFIG1: Database mode is wal
    ........... subsequent output the same as first bar times
    
    虽然数据库最初在WAL中,但没有未完成的事务(唯一的区别)

    测试3 如果行
    logMode(this.getWritableDatabase(),“CONSTRUCT”,DATABASE_NAME,context);//注意:将强制打开注释掉的
    ,并卸载应用程序并重新运行:-

    2019-07-07 10:56:23.314 I/InstantRun: starting instant run server: is main process
    2019-07-07 10:56:23.437 D/BUILD: Build is 28
    2019-07-07 10:56:23.438 D/-WALCHK ONCONFIG1: The -wal file doesn't exist.
    2019-07-07 10:56:23.438 D/-SHMCHK ONCONFIG1: The -shm file doesn't exist
    2019-07-07 10:56:23.439 D/LOGMODE ONCONFIG1: Database mode is truncate
    ........... subsequent output the same as first bar times
    

    然后第一次使用(在调用db.disablewriteaheadloging();
    之前没有强制使用open)会导致数据库处于截断模式。

    我不认为问题是直接由于WAL模式是否打开,而是您可能没有正确确定最后几个条目

    编码
    minInstance.setWriteAheadLoggingEnabled(假)将在调用配置本身之前直接关闭WAL(见下文)

    我要做的第一件事就是改变

    public myDbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
    
    致:-

    以确保您不会无意中获得myDBHelper的rouge实例

    作为临时措施,您可能还希望将以下方法添加到myDBHeleper类中:-

    public void logMode(SQLiteDatabase db, String tagextra, String dbname, Context context) {
        Log.d("BUILD","Build is " + Build.VERSION.SDK_INT);
        File dbf = new File(context.getDatabasePath(dbname).toString());
        File dbfwal = new File(dbf.getPath() + "-wal");
        File dbfshm = new File(dbf.getPath() + "-shm");
        if (dbfwal.exists()) {
            Log.d("-WALCHK " + tagextra,"The -wal file was found an is " + String.valueOf(dbfwal.length()));
        } else {
            Log.d("-WALCHK " + tagextra,"The -wal file doesn't exist.");
        }
        if (dbfshm.exists()) {
            Log.d("-SHMCHK " + tagextra,"The -shm file was found an is " + String.valueOf(dbfwal.length()));
        } else {
            Log.d("-SHMCHK " + tagextra,"The -shm file doesn't exist");
        }
        if (db == null) {
            db = this.getWritableDatabase();
        }
        Cursor csr = db.rawQuery("PRAGMA journal_mode",null);
        if (csr.moveToFirst()) {
            Log.d("LOGMODE " + tagextra ,"Database mode is " + csr.getString(0));
        }
    }
    
    然后可以使用它来确定模式是否存在,以及-wal和-shm文件是否存在并具有任何数据

    简言之,它可以用来减轻人们对该问题是由WAL模式引起的任何担忧

    例如,使用myDatabaseHelper类的以下近似值。但是,除了您的代码之外:-

    • 上述logMode方法的调用已包含在相关点
    • onCreateMethod用于创建表和添加初始行
    • 构造函数已被设置为私有
    所以它看起来像:-

    public class myDbHelper extends SQLiteOpenHelper {
    
        public static final String DATABASE_NAME = "mydb";
        public static final int DATABASE_VERSION = 1;
    
        public static final String TBL_USER = "user";
        public static final String COL_USER_ID = BaseColumns._ID;
        public static final String COl_USER_NAME = "_name";
        public static final String COL_USER_EMAIL = "_email";
        public static final String COl_USER_PASSWORD = "_password";
    
        private static myDbHelper mInstance;
        private Context mContext;
    
        private myDbHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
            mContext = context;
            logMode(this.getWritableDatabase(),"CONSTRUCT",DATABASE_NAME,context); // Note will force an open
        }
        @Override
        public void onConfigure(SQLiteDatabase db) {
            logMode(db, "ONCONFIG1", DATABASE_NAME,mContext);
            super.onConfigure(db);
            db.disableWriteAheadLogging();
            logMode(db,"ONCONFIG2",DATABASE_NAME,mContext);
            Cursor c1=db.rawQuery("PRAGMA journal_mode=TRUNCATE",null);
            c1.close();
            logMode(db,"ONCONFIG3",DATABASE_NAME,mContext);
        }
    
    
        public static synchronized myDbHelper getInstance(Context context) {
    
            if (mInstance == null) {
                mInstance = new myDbHelper(context.getApplicationContext());
                mInstance.setWriteAheadLoggingEnabled(false);
            }
            mInstance.logMode(mInstance.getWritableDatabase(),"INSTANCE",mInstance.getDatabaseName(),context );
            return mInstance;
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
            logMode(db,"ONCREATE1",DATABASE_NAME,mContext);
            db.execSQL("CREATE TABLE IF NOT EXISTS " + TBL_USER +
                    "(" +
                    COL_USER_ID + " INTEGER PRIMARY KEY," +
                    COl_USER_NAME + " TEXT UNIQUE," +
                    COL_USER_EMAIL + " TEXT," +
                    COl_USER_PASSWORD + " TEXT" +
                    ")");
            //Add a row when oncreate is called
            db.execSQL("INSERT INTO " + TBL_USER + " (" +
                    COl_USER_NAME + "," +
                    COL_USER_EMAIL + "," +
                    COl_USER_PASSWORD +
                    ") VALUES('testuser','testuser@mail.com','1234567890')");
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
        }
    
        public long addUser(String name, String email, String passowrd) {
            ContentValues cv = new ContentValues();
            cv.put(COl_USER_NAME,name);
            cv.put(COL_USER_EMAIL,email);
            cv.put(COl_USER_PASSWORD,passowrd);
            SQLiteDatabase db = this.getWritableDatabase();
            logMode(db,"ADDUSER1",DATABASE_NAME,mContext);
            return db.insert(TBL_USER,null,cv);
        }
    
        public void logMode(SQLiteDatabase db, String tagextra, String dbname, Context context) {
            Log.d("BUILD","Build is " + Build.VERSION.SDK_INT);
            File dbf = new File(context.getDatabasePath(dbname).toString());
            File dbfwal = new File(dbf.getPath() + "-wal");
            File dbfshm = new File(dbf.getPath() + "-shm");
            if (dbfwal.exists()) {
                Log.d("-WALCHK " + tagextra,"The -wal file was found an is " + String.valueOf(dbfwal.length()));
            } else {
                Log.d("-WALCHK " + tagextra,"The -wal file doesn't exist.");
            }
            if (dbfshm.exists()) {
                Log.d("-SHMCHK " + tagextra,"The -shm file was found an is " + String.valueOf(dbfwal.length()));
            } else {
                Log.d("-SHMCHK " + tagextra,"The -shm file doesn't exist");
            }
            if (db == null) {
                db = this.getWritableDatabase();
            }
            Cursor csr = db.rawQuery("PRAGMA journal_mode",null);
            if (csr.moveToFirst()) {
                Log.d("LOGMODE " + tagextra ,"Database mode is " + csr.getString(0));
            }
        }
    }
    
    以下是片段的onStart方法:-

    @Override
    public void onStart() {
        super.onStart();
        myDbHelper dbHelper = myDbHelper.getInstance(getActivity());
        dbHelper.logMode(dbHelper.getWritableDatabase(),"FRGONSTRT1",myDbHelper.DATABASE_NAME,getActivity());
        dbHelper.addUser("Fred","fred@fredmail.com","password");
        Cursor csr = dbHelper.getReadableDatabase().query(myDbHelper.TBL_USER,null,null,null,null,null,null);
        DatabaseUtils.dumpCursor(csr);
        csr.close();
    }
    
    就是这样:-

  • 获取myDBHelper实例
  • 调用logMode方法
  • 添加一行
  • 将所有数据提取到游标中并转储游标
  • 测试 测试1 在具有API 28的Android(仿真器)上卸载应用程序并运行会导致:-

    2019-07-07 10:38:56.022 D/BUILD: Build is 28
    2019-07-07 10:38:56.022 D/-WALCHK ONCONFIG1: The -wal file was found an is 16512
    2019-07-07 10:38:56.022 D/-SHMCHK ONCONFIG1: The -shm file was found an is 16512
    2019-07-07 10:38:56.023 D/LOGMODE ONCONFIG1: Database mode is wal
    2019-07-07 10:38:56.038 D/BUILD: Build is 28
    2019-07-07 10:38:56.038 D/-WALCHK ONCONFIG2: The -wal file doesn't exist.
    2019-07-07 10:38:56.038 D/-SHMCHK ONCONFIG2: The -shm file doesn't exist
    2019-07-07 10:38:56.039 D/LOGMODE ONCONFIG2: Database mode is truncate
    2019-07-07 10:38:56.039 D/BUILD: Build is 28
    2019-07-07 10:38:56.039 D/-WALCHK ONCONFIG3: The -wal file doesn't exist.
    2019-07-07 10:38:56.039 D/-SHMCHK ONCONFIG3: The -shm file doesn't exist
    2019-07-07 10:38:56.040 D/LOGMODE ONCONFIG3: Database mode is truncate
    2019-07-07 10:38:56.041 D/BUILD: Build is 28
    2019-07-07 10:38:56.042 D/-WALCHK ONCREATE1: The -wal file doesn't exist.
    2019-07-07 10:38:56.043 D/-SHMCHK ONCREATE1: The -shm file doesn't exist
    2019-07-07 10:38:56.043 D/LOGMODE ONCREATE1: Database mode is truncate
    2019-07-07 10:38:56.054 D/BUILD: Build is 28
    2019-07-07 10:38:56.054 D/-WALCHK CONSTRUCT: The -wal file doesn't exist.
    2019-07-07 10:38:56.055 D/-SHMCHK CONSTRUCT: The -shm file doesn't exist
    2019-07-07 10:38:56.055 D/LOGMODE CONSTRUCT: Database mode is truncate
    2019-07-07 10:38:56.056 D/BUILD: Build is 28
    2019-07-07 10:38:56.057 D/-WALCHK INSTANCE: The -wal file doesn't exist.
    2019-07-07 10:38:56.057 D/-SHMCHK INSTANCE: The -shm file doesn't exist
    2019-07-07 10:38:56.058 D/LOGMODE INSTANCE: Database mode is truncate
    2019-07-07 10:38:56.058 D/BUILD: Build is 28
    2019-07-07 10:38:56.058 D/-WALCHK FRGONSTRT1: The -wal file doesn't exist.
    2019-07-07 10:38:56.058 D/-SHMCHK FRGONSTRT1: The -shm file doesn't exist
    2019-07-07 10:38:56.059 D/LOGMODE FRGONSTRT1: Database mode is truncate
    2019-07-07 10:38:56.059 D/BUILD: Build is 28
    2019-07-07 10:38:56.059 D/-WALCHK ADDUSER1: The -wal file doesn't exist.
    2019-07-07 10:38:56.059 D/-SHMCHK ADDUSER1: The -shm file doesn't exist
    2019-07-07 10:38:56.060 D/LOGMODE ADDUSER1: Database mode is truncate
    2019-07-07 10:38:56.069 I/System.out: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@4f533b6
    2019-07-07 10:38:56.070 I/System.out: 0 {
    2019-07-07 10:38:56.070 I/System.out:    _id=1
    2019-07-07 10:38:56.070 I/System.out:    _name=testuser
    2019-07-07 10:38:56.070 I/System.out:    _email=testuser@mail.com
    2019-07-07 10:38:56.070 I/System.out:    _password=1234567890
    2019-07-07 10:38:56.070 I/System.out: }
    2019-07-07 10:38:56.070 I/System.out: 1 {
    2019-07-07 10:38:56.070 I/System.out:    _id=2
    2019-07-07 10:38:56.070 I/System.out:    _name=Fred
    2019-07-07 10:38:56.070 I/System.out:    _email=fred@fredmail.com
    2019-07-07 10:38:56.070 I/System.out:    _password=password
    2019-07-07 10:38:56.070 I/System.out: }
    2019-07-07 10:38:56.070 I/System.out: <<<<<
    
    以前被调用过

    mInstance.setWriteAheadLoggingEnabled(false);
    
    数据库最初处于WAL模式,但行
    db.disablewriteaheadloging()将模式更改为截断并在执行此操作时提交事务(由于-wal文件的大小大于0,(-shm基本上是-wal文件的副本),因此在-wal文件中存在未完成的事务),具体如下:-

    2019-07-07 10:38:56.022 D/-WALCHK ONCONFIG1: The -wal file was found an is 16512
    
    事务已提交,因为在所有后续输出中,-wal文件已被删除

    测试2 重新运行应用程序(即现在使用现有数据)时,输出为:-

    2019-07-07 10:52:11.722 I/InstantRun: starting instant run server: is main process
    2019-07-07 10:52:11.812 D/BUILD: Build is 28
    2019-07-07 10:52:11.812 D/-WALCHK ONCONFIG1: The -wal file was found an is 0
    2019-07-07 10:52:11.812 D/-SHMCHK ONCONFIG1: The -shm file was found an is 0
    2019-07-07 10:52:11.813 D/LOGMODE ONCONFIG1: Database mode is wal
    ........... subsequent output the same as first bar times
    
    虽然数据库最初在WAL中,但没有未完成的事务(唯一的区别)

    测试3 如果行
    logMode(this.getWritableDatabase(),“CONSTRUCT”,DATABASE_NAME,context);//注意:将强制打开注释掉的
    ,并卸载应用程序并重新运行:-

    2019-07-07 10:56:23.314 I/InstantRun: starting instant run server: is main process
    2019-07-07 10:56:23.437 D/BUILD: Build is 28
    2019-07-07 10:56:23.438 D/-WALCHK ONCONFIG1: The -wal file doesn't exist.
    2019-07-07 10:56:23.438 D/-SHMCHK ONCONFIG1: The -shm file doesn't exist
    2019-07-07 10:56:23.439 D/LOGMODE ONCONFIG1: Database mode is truncate
    ........... subsequent output the same as first bar times
    
    然后是第一个