ADB拉取时Android SQLite数据库损坏

3

我在Android上使用SQLite数据库时遇到了一个大问题。在文件DatabaseContra.java中,我有以下代码:

public static class HeartRateEntry implements BaseColumns {
    public static final String TABLE_NAME = "heart_rate_readings";
    public static final String COLUMN_NAME_SESSION_ID = "session_id";
    public static final String COLUMN_NAME_SENSOR_ID= "sensor_id";
    public static final String COLUMN_NAME_TIMESTAMP_NANO = "timestamp_nano";
    public static final String COLUMN_NAME_TIMESTAMP_MILLI = "timestamp_milli";
    public static final String COLUMN_NAME_HR = "heart_rate";
    public static final String COLUMN_NAME_RR = "rr_interval";
}

在继承自SQLiteOpenHelper的DatabaseHelper类中,我有一个用于创建表的创建语句:
private static final String CREATE_TABLE_HEART_RATE_READINGS =
        "CREATE TABLE " + DatabaseContract.HeartRateEntry.TABLE_NAME + " (" +
                DatabaseContract.HeartRateEntry._ID + " INTEGER PRIMARY KEY," +
                DatabaseContract.HeartRateEntry.COLUMN_NAME_SESSION_ID + " INTEGER NOT NULL," +
                DatabaseContract.HeartRateEntry.COLUMN_NAME_SENSOR_ID + " INTEGER NOT NULL," +
                DatabaseContract.HeartRateEntry.COLUMN_NAME_TIMESTAMP_NANO + " INTEGER NOT NULL," +
                DatabaseContract.HeartRateEntry.COLUMN_NAME_TIMESTAMP_MILLI + " INTEGER NOT NULL," +
                DatabaseContract.HeartRateEntry.COLUMN_NAME_HR + " INTEGER," +
                DatabaseContract.HeartRateEntry.COLUMN_NAME_RR + " INTEGER);";

public void onCreate(SQLiteDatabase db)方法中,我正在创建表格db.execSQL(CREATE_TABLE_HEART_RATE_READINGS); 现在,我尝试通过每秒插入一行。
SQLiteOpenHelper mDatabaseHelper = new DatabaseHelper(MainActivity.context);
SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(DatabaseContract.HeartRateEntry.COLUMN_NAME_SESSION_ID, MainActivity.sessionDbID);
contentValues.put(DatabaseContract.HeartRateEntry.COLUMN_NAME_SENSOR_ID, MainActivity.polarDbID);
contentValues.put(DatabaseContract.HeartRateEntry.COLUMN_NAME_TIMESTAMP_NANO, timeNano);
contentValues.put(DatabaseContract.HeartRateEntry.COLUMN_NAME_TIMESTAMP_MILLI, timeMilli);
contentValues.put(DatabaseContract.HeartRateEntry.COLUMN_NAME_HR, hr);
contentValues.put(DatabaseContract.HeartRateEntry.COLUMN_NAME_RR, rr[i]);
db.insert(DatabaseContract.HeartRateEntry.TABLE_NAME, null, contentValues);

该数据库用于服务,但我正在使用MainActivity的上下文(我已将其存储在其中的静态变量中)。我在服务中使用它,但只是使用MainActivity的上下文。我保持连接打开状态,并仅在最后关闭它。我还只使用一个连接到数据库。

执行时我没有收到任何错误消息。但是,我随后会从我的PC中提取数据库

adb -d shell "run-as com.example cat /data/data/com.example/databases/sensors.db" > C:\Users\myName\Desktop\sensors.db

当我现在使用SQLiteStudio打开数据库并想要访问表时,会出现以下错误信息:
“无法加载heart_rate_readings表的数据。错误详情: 在sensors数据库上执行SQL查询时出错:数据库磁盘图像已损坏。”
可能是什么原因造成了这个错误呢?我完全被卡住了,不知道应该怎么做。我正在使用Android 5.1。
我还定义了其他表格(用户信息等),这些表格可以正常工作(但在这些表格中,我只输入一次记录,而不是每秒钟)。
1个回答

2
从设备中获取数据库的命令:
adb -d pull /data/data/com.example/databases/sensors.db

如果您无法像这样访问数据库,但run-as对您有效,请将数据库复制到公共可访问位置(例如/),然后使用pull

谢谢您的编辑。但是为什么我的命令不起作用呢?它也使用了adb。adb -d shell "run-as com.example cat /data/data/com.example/databases/sensors.db" > C:\Users\myName\Desktop\sensors.db - machinery
@machinery,我不确定。我猜有两个可能的问题:1)cat损坏了数据库2)adb shell损坏了数据库。 - Vasiliy
@machinery,你可以尝试以下命令:adb -d shell "run-as com.example cat /data/data/com.example/databases/sensors.db > /sensors.db" 然后再执行 adb -d pull /sensors.db。如果成功了,那么问题就在于通过 adb shell 传输数据库文件的过程中。如果还是不行,那可能是 cat 命令的问题。 - Vasiliy
谢谢,我会尝试一下。如果猫(cat)是问题所在,我该如何解决?因为我需要用猫来将文件复制到可访问的位置。其次,您提供的adb pull命令是否也有可能在PC上提供存储位置(例如C:\ sensors.db)? - machinery
1
看起来 adb exec-out run-as package.name cat databases/file > file 可以工作。因此问题可能是由 shell 引起的。 - machinery
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接