2012-09-11 102 views
0

我想限制我的SQLite Db中的行數爲一個。我已經在每個地方尋找適當的解決方案,但沒有得到任何地方。我收到了許多建議(約束,觸發器等),但還沒有真正找到一個解決方案,以我目前的技能水平實現。我決定嘗試觸發器,但無法找到正確編寫代碼的位置。我有結構,但不知道如何正確地格式化語法。我的代碼是低於哪個當然不工作(編譯錯誤)。任何幫助指示如何正確地編寫此代碼爲Android將不勝感激。我已經被各地sqlite.org網站(http://www.sqlite.org/lang_createtrigger.htmlSQLIte行限制

public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub  

     String sqlDataStore = "create table if not exists " + 
     TABLE_NAME_CREDENTIALS + " ("+ BaseColumns._ID + " integer primary key " + " ON CONFLICT FAIL ," 

        + COLUMN_NAME_USERNAME + " TEXT NOT NULL " + " UNIQUE," 
        + COLUMN_NAME_PASSWORD + " TEXT NOT NULL " + " UNIQUE);"; 

     db.execSQL(CREATE TRIGGER " row_limiter " + " BEFORE INSERT " 
       + " ON " 
       + " TABLE_NAME_CREDENTIALS " 
       + " FOR EACH ROW WHEN " 
       + (SELECT + "_id" + FROM + " TABLE_NAME_CREDENTIALS ") > "1" 
       + BEGIN 
        DELETE FROM + "TABLE_NAME_CREDENTIALS" + WHERE + "_id " > "1"; 
        END 



     db.execSQL(sqlDataStore); 
    } 

DB與主鍵設置爲表:

String sqlDataStore = "create table if not exists " + 
        TABLE_NAME_CREDENTIALS + " ("+ BaseColumns._ID + " NOT NULL," 

           + COLUMN_NAME_USERNAME + " TEXT NOT NULL, " 
           + COLUMN_NAME_PASSWORD + " TEXT NOT NULL, " 
           + " PRIMARY KEY (username, passcode))"; 

插入:

contentValues.put(LoginDB.COLUMN_NAME_USERNAME, rUsername); 
contentValues.put(LoginDB.COLUMN_NAME_PASSWORD, rPasscode); 
+0

可能重複:http://stackoverflow.com/questions/2035670/limit-an-sqlite-tables-maximum-行數 –

+0

這是相似的,但不是重複的。你所指的與限制而不是觸發器有關。從我的知識限制聲明不適用於Android SQLite .. – sean

回答

0

爲什麼不計數行號並保護它,然後再插入?爲什麼堅持SQL命令? 順便說一句,另一個解決方法是預先創建行的限制,並使用更新,而不是插入。

+0

你說什麼聽起來很明智,但我無法形象化。你能提供一個例子嗎 – sean

+0

你可以預先插入100個虛擬內容的行,然後只更新這些虛擬行,而不是插入新行。並通過其COUNT <= 100 –

1

將表限制爲一行最簡單的方法可能是使用表中的主鍵,並確保在插入或更新時始終將其設置爲常量值。不需要觸發器或其他技巧。

CREATE TABLE `limited_table` (
    `id` int(11) NOT NULL, 
    `value` text , 
    PRIMARY KEY (`id`) 
) 

現在更換時,總是使用恆定在您的SQL查詢

ContentValues args = new ContentValues(); 
args.put(KEY_ID, LIMITED_ID_CONST); 
args.put(KEY_VALUE, value); 
//Replace 
db.replace(DATABASE_TABLE, null, args); 
+0

加入表的主保護,但我不確定將主鍵設置爲第1行的列的語法 – sean