2013-03-30 19 views
1

我在創建/讀取SQLite數據庫時遇到了一些困難。在Android應用程序中凍結SQLite-DB

在我身邊有本教程here我想實現一個數據庫到我的(是的,嘲笑我)掃雷應用程序存儲設置,如寬度,高度和計數的地雷在球場。

我想到了一個表是這樣的:

+-----------+--------+-----+ 
| Field  | Type | Key | 
+-----------+--------+-----+ 
| _bez  | text | pri | 
| _x  | int |  | 
| _y  | int |  | 
| _a  | int |  | 
+-----------+--------+-----+ 

對於我有了這個代碼,我想,這遠都應該罰款:

public class SettingsDB extends SQLiteOpenHelper { 
//DB-Info 
private static final int DATENBANK_VERSION = 1; 
private static final String DATENBANK_NAME = "minesweeper.db"; 
private static final String TABLE_SETTINGS = "settings"; 
//Spalten der Settings-Tabelle 
private static final String KEY_BEZ = "bez"; 
private static final String KEY_X = "x"; 
private static final String KEY_Y = "y"; 
private static final String KEY_A = "a"; 

public SettingsDB(Context context) { 
    super(context, DATENBANK_NAME, null, DATENBANK_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    String createDB; 
    createDB = "CREATE TABLE " + TABLE_SETTINGS + "(" 
      + KEY_BEZ + " TEXT PRIMARY KEY, " 
      + KEY_X + " INTEGER, " 
      + KEY_Y + " INTEGER, " 
      + KEY_A + " INTEGER)"; 
    db.execSQL(createDB); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_SETTINGS); 
    onCreate(db); 
} 
} 

這表我想填充四個標準行,簡單,中等,具有模式的值以及當前值(可由用戶通過佈局中的三個EditText字段更改)。

因此,我需要添加這些基本值的方法(直接在創建數據庫之後),向用戶顯示當前值,並在保存設置時使用當前值更新該行。

這裏 - 再次基礎上,嘖嘖 - 我有這樣的:

public void set_stdValues() { 
     SQLiteDatabase db = this.getWritableDatabase(); 

     ContentValues val_easy = new ContentValues(); 
     val_easy.put(KEY_BEZ, "Easy"); 
     val_easy.put(KEY_X, 10); 
     val_easy.put(KEY_Y, 10); 
     val_easy.put(KEY_A, 10); 
     db.insert(TABLE_SETTINGS, null, val_easy); 

     ContentValues val_curr = new ContentValues(); 
     val_curr.put(KEY_BEZ, "Curr"); 
     val_curr.put(KEY_X, 10); 
     val_curr.put(KEY_Y, 10); 
     val_curr.put(KEY_A, 10); 
     db.insert(TABLE_SETTINGS, null, val_curr); 

     ContentValues val_med = new ContentValues(); 
     val_med.put(KEY_BEZ, "Med"); 
     val_med.put(KEY_X, 12); 
     val_med.put(KEY_Y, 12); 
     val_med.put(KEY_A, 20); 
     db.insert(TABLE_SETTINGS, null, val_med); 

     ContentValues val_hard = new ContentValues(); 
     val_hard.put(KEY_BEZ, "Hard"); 
     val_hard.put(KEY_X, 15); 
     val_hard.put(KEY_Y, 15); 
     val_hard.put(KEY_A, 40); 
     db.insert(TABLE_SETTINGS, null, val_hard); 

     db.close(); 
    } 

    public Settings getValues(String diff) { 
     SQLiteDatabase db = this.getReadableDatabase(); 

     String[] cols = new String[] { KEY_BEZ, KEY_X, KEY_Y, KEY_A }; 
     Cursor cursor = db.query(TABLE_SETTINGS, cols, KEY_BEZ + "=?", new String[] { diff }, null, null, null, null); 
     if (cursor != null) { 
      cursor.moveToFirst(); 
     } 
     Settings settings = new Settings(cursor.getString(0), cursor.getInt(1), cursor.getInt(2), cursor.getInt(3)); 
     cursor.close(); 
     db.close(); 
     return settings; 
    } 

    // public Settings(String bez, int x, int y, int a) 
    public void setValues(Settings s) { 
     SQLiteDatabase db = this.getWritableDatabase(); 

     ContentValues values = new ContentValues(); 
     values.put(KEY_X, s.get_x()); 
     values.put(KEY_Y, s.get_y()); 
     values.put(KEY_A, s.get_a()); 

     db.update(TABLE_SETTINGS, values, KEY_BEZ + "=?", new String[] { "Curr" }); 
     db.close(); 
    } 

在執行凍結在點,其中的數據應該從數據庫中讀取的應用程序。

我希望這提供了足夠的信息,有人可能會發現我犯的錯誤。

預先感謝您。從set_stdValues()

+0

什麼類沒有set_stdValues()屬於? –

+0

這個和下面兩個也是SettingsDB的一部分 –

回答

2

刪除SQLiteDatabase db = this.getWritableDatabase();db.close();

@Override 
public void onCreate(SQLiteDatabase db) { 
String createDB; 
createDB = "CREATE TABLE " + TABLE_SETTINGS + "(" 
     + KEY_BEZ + " TEXT PRIMARY KEY, " 
     + KEY_X + " INTEGER, " 
     + KEY_Y + " INTEGER, " 
     + KEY_A + " INTEGER)"; 
db.execSQL(createDB); 

set_stdValues() 
} 
+0

我會試試看,但是 會發生什麼db.insert(TABLE_SETTINGS,null,val_easy); 報表呢? –

+0

你是什麼意思?它只是在set_stdValues方法中放置它。您的表是在db.execSQL(createDB)行中創建的;之後你可以插入。 –

+0

啊,對不起,在我身邊出了問題。 它做到了,謝謝! =) –