2015-01-07 42 views
2

我在處理多個SQLite DB文件時仍然遇到了很多麻煩。每個DB文件都有它自己的日誌文件,我認爲一旦完成寫作,它應該消失。事實上他們留下來,所以我在刪除DB文件時遇到了麻煩,因爲日誌文件似乎阻止了刪除請求(文件刪除)。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 

如果您需要了解更多信息,請自找的,我很絕望...... :-( 謝謝提前!

回答

0

只是爲了關閉這個,當時我試圖將不同的實體保存到他們自己的數據庫中。一旦我想刪除一個實體,我試圖刪除數據庫文件。現在我非常確定這是不好的做法,更好的方法是將實體存儲在單個數據庫中,並使用CRUD(創建,讀取,更新,刪除)方法來管理它們。

1

-journal可以存在,特別是在數據庫已經被配置爲不刪除它。 (這可能被設置爲部分Android設備的默認。)

只是不要嘗試打開以-journal-wal作爲數據庫結尾的文件。

+0

對於使用數據庫日誌文件不是一個很大的問題。正如你已經提到過的,我可以跳過日誌文件,並且每一個看起來都很好。 爲了物理刪除文件,我需要先刪除日誌文件。這對我來說是錯誤的,所以我想弄清楚爲什麼這些雜誌存在以及爲什麼會造成這麼多麻煩。 有幾種不同的方法來解決這個刪除方法,但是由於數據庫可能會變得非常大,我想避免通過設置「delete-」標記來刪除數據庫。 – RuNaWaY87

+1

當沒有數據庫連接時,可以刪除所有文件。 –

相關問題