2013-06-30 75 views
0

我有一個sqlite數據庫只有一列填充了一些名字我從一堆edittexts.I'm使用它來支持自動完成。 我已經設置數據庫爲該列的唯一,所以我不會在我的自動完成中得到重複。 事情是,我想做出如下: 如果有人輸入重複,請在數據庫中爲該名稱計數器。所以如果我輸入「奶酪」5次數據庫中的「奶酪」將有5在不同的列中。 我想用這個來實現的是顯示最經常使用的自動完成功能,還有一些「頂級使用的名稱」listview或其他東西。 你能幫我一個片段嗎?如何檢測它何時嘗試向數據庫中輸入副本並增加計數器? 謝謝!這是我的代碼到目前爲止。SQLite:如果重複,增加計數器

public class SQLiteCountryAssistant extends SQLiteOpenHelper 
{ 
private static final String DB_NAME = "usingsqlite.db"; 
private static final int DB_VERSION_NUMBER = 1; 
private static final String DB_TABLE_NAME = "countries"; 
private static final String DB_COLUMN_1_NAME = "country_name"; 

private static final String DB_CREATE_SCRIPT = "create table " + DB_TABLE_NAME + 
         " (_id integer primary key autoincrement, country_name text UNIQUE);)"; 

private SQLiteDatabase sqliteDBInstance = null; 

public SQLiteCountryAssistant(Context context) 
{ 
    super(context, DB_NAME, null, DB_VERSION_NUMBER); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
{ 
    // TODO: Implement onUpgrade 
} 

@Override 
public void onCreate(SQLiteDatabase sqliteDBInstance) 
{ 
    Log.i("onCreate", "Creating the database..."); 
    sqliteDBInstance.execSQL(DB_CREATE_SCRIPT); 
} 

public void openDB() throws SQLException 
{ 
    Log.i("openDB", "Checking sqliteDBInstance..."); 
    if(this.sqliteDBInstance == null) 
    { 
     Log.i("openDB", "Creating sqliteDBInstance..."); 
     this.sqliteDBInstance = this.getWritableDatabase(); 

    } 
} 

public void closeDB() 
{ 
    if(this.sqliteDBInstance != null) 
    { 
     if(this.sqliteDBInstance.isOpen()) 
      this.sqliteDBInstance.close(); 
    } 
} 

public long insertCountry(String countryName) 
{ 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(DB_COLUMN_1_NAME, countryName); 

    return this.sqliteDBInstance.insert(DB_TABLE_NAME, null, contentValues); 
} 

public boolean removeCountry(String countryName) 
{ 
    int result = this.sqliteDBInstance.delete(DB_TABLE_NAME, "country_name='" + countryName + "'", null); 

    if(result > 0) 
     return true; 
    else 
     return false; 
} 

public long updateCountry(String oldCountryName, String newCountryName) 
{ 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(DB_COLUMN_1_NAME, newCountryName); 
    return this.sqliteDBInstance.update(DB_TABLE_NAME, contentValues, "country_name='" + oldCountryName + "'", null); 
} 

public String[] getAllCountries() 
{ 
    Cursor cursor = this.sqliteDBInstance.query(DB_TABLE_NAME, new String[] {DB_COLUMN_1_NAME}, null, null, null, null, DB_COLUMN_1_NAME + " ASC"); 

    if(cursor.getCount() >0) 
    { 
     String[] str = new String[cursor.getCount()]; 
     int i = 0; 

     while (cursor.moveToNext()) 
     { 
      str[i] = cursor.getString(cursor.getColumnIndex(DB_COLUMN_1_NAME)); 
      i++; 
     } 
     return str; 
    } 
    else 
    { 
     return new String[] {}; 
    } 
} 

}

回答

0

我不知道這是做正確的方式,但一個潛在的解決方案可能是這樣的: 每次用戶輸入一個名字,或者每次在EditText文改變(你可以聽這與TextWatcher監聽器),使以下列方式查詢數據庫(僞):

SELECT ALL FROM countries WHERE country_name = editText.getText() 

與其他詞時,檢查一下countries表已經是這樣的文本,使用r正在打字。如果返回的結果爲0,則知道該名稱從未被查詢,如果返回的結果大於0,則必須以1遞增的方式提取其相關的計數值。

0

在這裏看到:https://stackoverflow.com/a/2718352/2529026

INSERT OR IGNORE INTO visits VALUES ($ip, 0); 
UPDATE visits SET hits = hits + 1 WHERE ip LIKE $ip; 

更換visitscountries$ipcountry。這是SQLite的等效

INSERT ..... ON DUPLICATE UPDATE ....; 
+0

很抱歉這麼晚纔回復,忙於我的巴徹勒度(社會學,那麼你就會明白爲什麼我「這樣的」一本初學者,我沒有編程背景)。從我看到的情況來看,這與我到目前爲止學到的任何東西都不相似,當涉及到android sqlite時。爲什麼?這是一些其他類型的SQLite嗎?我如何在我的項目中實現這一點?對不起,這個愚蠢的問題...我開始學習像3-4周前.. –

+0

我必須做這樣的事情嗎? String sql =「INSERT或IGNORE INTO訪問VALUES($ ip,0)」; db.execSQL(sql);或者db.execSQL(//直接在這裏命令); ?對不起,如果我錯了,真的很難理解,從頭開始,不得不研究每一個細節,嘿。 –

+0

示例代碼來自PHP問題。 $ ip是一個PHP變量。你會用你的價值取代它。因此,例如: INSERT或IGNORE INTO國家VALUES('America',0);'後面跟'UPDATE國家SET點擊率=點擊數+1 WHERE country ='America'' 如果沒有這樣的國家,它被添加並且其命中計數設置爲0,然後立即更新爲1.如果在DB中有*這樣的國家,則第一個語句被忽略並且其命中計數器增加1. 你可以運行這個像'db.execSQL(sql);'其中sql是你的sql變量。我在我的android sqlite界面上有點生疏。 –