SqLite 日志文件出现问题。 "file is encrypted or is not a database"
Trouble with SqLite Journal files. "file is encrypted or is not a database"
我在处理多个 SQLite 数据库文件时仍然遇到很多麻烦。每个数据库文件都有自己的日志文件,我认为一旦写入完成,它就会消失。事实上他们留下来了,所以我在删除数据库文件时遇到了麻烦,因为日志文件似乎阻止了删除请求(文件删除)。
我现在没有什么想法了,老实说,我对 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 吗?日志文件破坏了我的数据库列表,因为每条记录都有一个由日志文件引起的幽灵条目。此外,当我尝试加载现有的 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
如果您需要更多信息,请询问,我很绝望...:-(
提前致谢!
-journal
可以存在,特别是如果数据库已配置为不删除它。
(这可能在某些 Android 设备上设置为默认设置。)
只是不要尝试打开以 -journal
或 -wal
结尾的文件作为数据库。
只是为了关闭这个,当时我试图将不同的实体保存到它们自己的数据库中。一旦我想删除一个实体,我就尝试删除db文件。现在我很确定这是不好的做法,更好的方法是将实体存储在单个数据库中并使用 CRUD(创建、读取、更新、删除)方法管理它们。
我在处理多个 SQLite 数据库文件时仍然遇到很多麻烦。每个数据库文件都有自己的日志文件,我认为一旦写入完成,它就会消失。事实上他们留下来了,所以我在删除数据库文件时遇到了麻烦,因为日志文件似乎阻止了删除请求(文件删除)。
我现在没有什么想法了,老实说,我对 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 吗?日志文件破坏了我的数据库列表,因为每条记录都有一个由日志文件引起的幽灵条目。此外,当我尝试加载现有的 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
如果您需要更多信息,请询问,我很绝望...:-( 提前致谢!
-journal
可以存在,特别是如果数据库已配置为不删除它。
(这可能在某些 Android 设备上设置为默认设置。)
只是不要尝试打开以 -journal
或 -wal
结尾的文件作为数据库。
只是为了关闭这个,当时我试图将不同的实体保存到它们自己的数据库中。一旦我想删除一个实体,我就尝试删除db文件。现在我很确定这是不好的做法,更好的方法是将实体存储在单个数据库中并使用 CRUD(创建、读取、更新、删除)方法管理它们。