我在处理多个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
如果您需要更多信息,请提出要求,我绝望...... :-( 提前谢谢!
答案 0 :(得分:1)
-journal
可以存在,特别是如果数据库已配置为不删除它。
(这可能会在某些Android设备上设置为默认设置。)
请勿尝试打开以-journal
或-wal
结尾的文件作为数据库。
答案 1 :(得分:0)
只是关闭这个,那个时候我试图将不同的实体保存到他们自己的数据库中。一旦我想删除一个实体,我就试图删除db文件。现在我很确定这是不好的做法,更好的方法是将实体存储在一个数据库中,并使用CRUD(创建,读取,更新,删除)方法管理它们。