SqLite期刊文件有问题。 “文件已加密或不是数据库”

时间:2015-01-07 17:56:13

标签: android sqlite sqliteopenhelper

我在处理多个SQLite DB文件时仍然遇到很多麻烦。每个DB文件都有自己的日志文件,一旦完成写入,我认为它应该消失。实际上它们仍然存在,因此我在删除DB文件时遇到了麻烦,因为日志文件似乎阻止了删除请求(文件删除)。

我现在已经没有想法,说实话,我对SqLite不是很有经验,所以也许其他地方有一个简单的错误。

我使用的是SQLiteOpenHelper。这是我的onCreate()。

@Override
public void onCreate(SQLiteDatabase db) {

    Log.d(TAG, "onCreate");

    // SQL statement to create track table
    String CREATE_TRACK_TABLE = "CREATE TABLE track ( "
            + "name TEXT PRIMARY KEY, " + "version REAL, "
            + "creatingDate TEXT )";

    // create track table
    db.execSQL(CREATE_TRACK_TABLE);

    ...
}

以下是我如何写入数据库的示例。

// add single track
public void addTrack(Track track) {

    // 1. get reference to writable DB
    SQLiteDatabase db = this.getWritableDatabase();

    // 2. create ContentValues to add key "column"/value
    ContentValues values = new ContentValues();
    values.put(Track.KEY_NAME, track.getName()); // get name
    values.put(Track.KEY_VERSION, track.getVersion()); // get version
    values.put(Track.KEY_CREATINGDATE, track.getCreatingDateString()); // get
                                                                        // version

    // 3. insert
    db.insert(Track.TABLE_NAME, // table
            null,               // nullColumnHack
            values);            // key/value -> keys = column names/ values = column
                                // values

    // 4. close
    db.close();
}

以下是我如何阅读数据库的示例。

// Get single track
public Track getTrack(String name) {

    // 1. get reference to readable DB
    SQLiteDatabase db = this.getReadableDatabase();

    // 2. build query
    Cursor cursor = db.query(Track.TABLE_NAME, // a. table
            Track.COLUMNS, // b. column names
            " name = ?", // c. selections
            new String[] { name }, // d. selections args
            null, // e. group by
            null, // f. having
            null, // g. order by
            null); // h. limit

    // 3. if we got results get the first one
    if (cursor != null)
        cursor.moveToFirst();

    // 4. build track object
    Track track = new Track();
    track.setName(cursor.getString(0));
    track.setVersion(Float.parseFloat(cursor.getString(1)));

    if (cursor != null)
        cursor.close();

    // 5. return track
    return track;
}

当我完成录制时,我仍然有一个-journal文件。有人知道日志文件是否必须存在或者是否应该消失?我是否必须以任何特定方式关闭SQLiteOpenHelper?日志文件破坏了我的数据库列表,因为每个记录都有一个由日志文件引起的ghost-entry。此外,当我尝试加载现有的DB文件时,我收到此错误:

E/SQLiteLog﹕ (26) file is encrypted or is not a database
E/DefaultDatabaseErrorHandler﹕ Corruption reported by sqlite on database:    /data/data/etw.com.roadtracker/databases/TestTrack-journal
E/DefaultDatabaseErrorHandler﹕ deleting the database file: /data/data/etw.com.roadtracker/databases/TestTrack-journal

如果您需要更多信息,请提出要求,我绝望...... :-( 提前谢谢!

2 个答案:

答案 0 :(得分:1)

-journal可以存在,特别是如果数据库已配置为不删除它。 (这可能会在某些Android设备上设置为默认设置。)

请勿尝试打开以-journal-wal结尾的文件作为数据库。

答案 1 :(得分:0)

只是关闭这个,那个时候我试图将不同的实体保存到他们自己的数据库中。一旦我想删除一个实体,我就试图删除db文件。现在我很确定这是不好的做法,更好的方法是将实体存储在一个数据库中,并使用CRUD(创建,读取,更新,删除)方法管理它们。