使用ADB拉动时,Android SQLite数据库已损坏

时间:2017-06-19 16:53:00

标签: android android-sqlite

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类中,我有表的create语句:

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的上下文。我将连接打开到数据库,并且只在最后关闭它。我也只使用一个数据库连接。

执行时我没有收到任何错误消息。但随后我用

从我的电脑上拉数据库
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的数据。错误详情:   在数据库'传感器':数据库磁盘上执行SQL查询时出错   图像格式不正确

错误是什么?我完全陷入困境,不知道它可能是什么。我使用的是Android 5.1。

我还定义了其他表(用户信息等)。这些表工作(但我只输入一次而不是每秒一次)。

1 个答案:

答案 0 :(得分:1)

从设备中提取数据库的命令:

adb -d pull /data/data/com.example/databases/sensors.db

如果您无法像这样访问数据库,但run-as适合您,请将数据库复制到可公开访问的位置(例如/),然后使用pull。< / p>