首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >值存储在..db shm和..db wal中,而不是实际的SQLite文件,而不是在Android中插入

值存储在..db shm和..db wal中,而不是实际的SQLite文件,而不是在Android中插入
EN

Stack Overflow用户
提问于 2020-10-27 14:13:40
回答 2查看 820关注 0票数 1

我正在将值插入到存储在data>data>package_name>database文件中的现有数据库中。但是,在插入值时,这些值不是存储在data.db文件中,而是自动创建data.db-shmdata.db-wal文件,并保存在其中。我无法访问..db shm和..db wal文件,但从修改时间可以看出,每当我插入值时,这两个文件都被修改,而不是实际的修改。

下面是我的密码-

MainActivity.java

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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文件时,我没有看到我插入的值。数据库文件看起来没有修改。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-28 06:10:47

这种行为是正常的。这就是写前日志的工作方式。如果要备份或将数据库传输到其他地方,则可以执行

代码语言:javascript
运行
复制
 pragma wal_checkpoint

以确保所有插入的值都存储在主(.db3)文件中。或者你可以用

代码语言:javascript
运行
复制
pragma journal_mode=DELETE

参见这个问题:如何在SQLite系统中手动执行检查点?

这个:模式

票数 2
EN

Stack Overflow用户

发布于 2022-06-14 21:01:32

要将数据从. .db wal移动到.db,请使用PRAGMA wal_checkpoint,下面的代码适用于me -:

代码语言:javascript
运行
复制
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();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64556335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档