我正在将值插入到存储在data>data>package_name>database
文件中的现有数据库中。但是,在插入值时,这些值不是存储在data.db
文件中,而是自动创建data.db-shm
和data.db-wal
文件,并保存在其中。我无法访问..db shm和..db wal文件,但从修改时间可以看出,每当我插入值时,这两个文件都被修改,而不是实际的修改。
下面是我的密码-
MainActivity.java
package com.data.wifi;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import com.getcapacitor.BridgeActivity;
import com.getcapacitor.Plugin;
import java.util.ArrayList;
public class MainActivity extends BridgeActivity {
DBHelper dbHelper = new DBHelper(this);
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.execSQL("INSERT INTO applogs VALUES ('7760','Tue Oct 27 2020','Values inserted Successfully' )");
this.init(savedInstanceState, new ArrayList<Class<? extends Plugin>>() {{
// Additional plugins you've installed go here
}});
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.clear();
}
}
DBHelper.java
package com.data.wifi;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DBHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "data.db";
public DBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) { }
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }
}
每当我试图运行这段代码时,都会创建两个扩展名相同的db文件(.db-shm和.db-shm),而且从修改时间看,这两个文件似乎一直在被修改。在这个图中,wifi.db是实际的数据库文件。但是另外两个文件是自动创建的,看起来它只是在修改。
PS- 这段代码在模拟器中工作非常完美,只有当我试图在实际的移动设备上运行它时,我才面临这个问题。编辑--当我在模拟器中运行代码时,这些值被正确地插入到原始dbfile中,并且没有创建这样的shm和wal文件。我看到这是一个问题,因为当我试图提取我的db文件时,我没有看到我插入的值。数据库文件看起来没有修改。
发布于 2020-10-28 06:10:47
这种行为是正常的。这就是写前日志的工作方式。如果要备份或将数据库传输到其他地方,则可以执行
pragma wal_checkpoint
以确保所有插入的值都存储在主(.db3)文件中。或者你可以用
pragma journal_mode=DELETE
参见这个问题:如何在SQLite系统中手动执行检查点?
这个:模式
发布于 2022-06-14 21:01:32
要将数据从. .db wal移动到.db,请使用PRAGMA wal_checkpoint,下面的代码适用于me -:
SQLiteDatabase db = this.getWritableDatabase();
String query = "PRAGMA wal_checkpoint(full)";
Cursor cursor = db.rawQuery(query, null);
if (cursor != null && cursor.moveToFirst()) {
int a = cursor.getInt(0);
int b = cursor.getInt(1);
int c = cursor.getInt(2);
}
if (cursor != null) {
cursor.close();
}
https://stackoverflow.com/questions/64556335
复制相似问题