2013-07-06 104 views
0

我有一個數據庫與產品名稱,產品價格和產品計數器。 產品名稱是獨一無二的,每次輸入新的價值時都會替換產品價格,問題在於產品櫃檯。 其默認值爲1,當輸入新產品時,其值設置爲1.每當產品名稱發生衝突時,我需要增加它。因此,如果輸入Cheese兩次,則計數器將會說2依此類推。 我需要做的是當發生衝突時,給它的值加1。我想這樣做,因爲我稍後需要這個。我需要在我的應用程序中計劃實現的其他一些東西上將輸入值添加到表值中。sqlite如何增加衝突的價值

我該如何做到這一點?我想繼續按照我現在這樣做,用contentvalues方法插入,而不是用sqlite語法(INSERT,SELECT,etc)。這是甚至可能的嗎?因爲我在sqlite的syntax.And是一個絕對的0也,我需要它有,我可以在其他活動調用一個方法來插入到數據庫(如insertCountry(Japan,10)

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_COLUMN_2_NAME = "country_price"; 
private static final String DB_COLUMN_3_NAME = "country_counter"; 


private static final String DB_CREATE_SCRIPT = "create table " 
     + DB_TABLE_NAME 
     + " (_id integer primary key autoincrement, country_name text UNIQUE ON CONFLICT REPLACE,country_price text,country_counter integer default '1');)"; 

而且我這是怎麼插入:

public void insertCountry(String countryName, String countryPrice) { 
    sqliteDBInstance.execSQL("INSERT INTO " + DB_TABLE_NAME 
      + "(country_name, country_price) VALUES('" + countryName 
      + "', '" + countryPrice + "')"); 

} 
+0

我不明白你想達到什麼(這是一個購物車或其他東西?)。順便說一句,如果我以3歐元的價格插入3次奶酪,數據庫中的結果將是:奶酪9(價格)3(櫃檯)?如果我錯了,請修改您的問題並使其更具可讀性。 – JJ86

+0

是的,它就像購物車一樣。數據庫需要保存產品名稱(對於自動填充字段),該產品使用的最後價格(對於自動填充字段也是如此)以及計數器以知道多少次一個產品名稱已被使用。因此,如果您插入奶酪3次,價格將是3,櫃檯也將是3.我也修改了我插入數據的方式,編輯即將到來。如果您需要更多信息,請告訴我 –

+0

我已經編輯了我的答案,看看。 – JJ86

回答

0

我不知道你的數據庫類,但檢查this method

return this.sqliteDBInstance.insertWithOnConflict(DB_TABLE_NAME, null, contentValues, SQLiteDatabase.CONFLICT_REPLACE); 

如果您正確創建的列,如果有衝突,新的EN嘗試將取代舊的。

編輯:你最後的評論後,所有你需要的是一個更新:先查詢數據庫與你的項目的名稱(仔細檢查,如果參數都OK):

return this.sqliteDBInstance.query(DB_TABLE_NAME, null, DB_COLUMN_1_NAME + "=?", new String[] {productName}, null, null, null); 

這將返回光標與0或1行。如果不排,就可以繼續正常地插入數據(不要忘記添加計數器:1是在第一次插入):如果有1排

public void insertCountry(String countryName, String countryPrice) { 
sqliteDBInstance.execSQL("INSERT INTO " + DB_TABLE_NAME 
     + "(country_name, country_price) VALUES('" + countryName 
     + "', '" + countryPrice + "', '" + countryCounter + "')"); 

} 

,你的產品已經是你的數據庫,所以只是重複的光標,取計數器的值,它與this method添加+1和更新數據庫:

public int update (String table, ContentValues values, String whereClause, String[] whereArgs) 
+0

我不需要它來替換舊的...我需要它將1添加到計數器或添加特定值 –

0

遞增值到特定的細胞是不是在sqlite的使用。您必須閱讀單元格的當前值並將所需值添加到單元格中,並將其替換爲舊單元格。您可以使用更新方法。

public List<TableRow> getAllRows() { 
    List<TableRow> rows= new ArrayList<TableRow>(); 

    Cursor cursor = database.query(Helper.TABLE_SITUPS, allColumns, 
      null, null, null, null, null); 

    cursor.moveToFirst(); 
    while (!cursor.isAfterLast()) { 
     TableRow row = cursorToRow(cursor); 
     comments.add(row); 
     cursor.moveToNext(); 
    } 
    // Make sure to close the cursor 
    cursor.close(); 
    return rows; 
} 

的TableRow:

public void update(String countryName, String price, long id) { 
    ContentValues cv = new ContentValues(); 
    cv.put(dbHelper.COLUMN_1, countryName); // These Fields should be your 
             // String values of actual column 
             // names 
    cv.put(dbHelper.COLUMN_2, price); 
    database.update(dbHelper.TABLE_NAME, cv, "_id " + "=" + id, null); 
} 
每次你要行添加到您的表,你必須閱讀所有,並檢查該行exists.here是檢索所有行的方法時

是數據庫錶行的類,並且包含表示實際表列的字段。 迭代此列表並獲取每個人的「國家」值,您可以瞭解該行是否存在。

這些是sqlite數據庫編程的基本概念。我建議你在這個問題上研究一下。

+0

我的應用程序如何知道何時使用插入以及何時使用更新?我的用戶會輸入例如Chicken.Maybe它已經在數據庫中,或者它不是。 –

+0

我解釋說在編輯 –

+0

用「INSERT INTO」+ DB_TABLE_NAME +「(country_name,country_price)VALUES('」+ countryName +「','+ countryPrice +'')」'會更容易嗎? –