0

我有一个包含产品名称、产品价格和产品计数器的数据库。产品名称是唯一的,每次输入新值时都会替换产品价格,问题出在产品计数器上。它的默认值是1,当输入一个新产品时,他的值设置为1。每当产品名称发生冲突时,我需要它增加。所以如果Cheese输入两次,计数器会说2等等。我需要它做的是当发生冲突时,将其值加 1。我想这样做是因为我稍后会需要它。我需要将输入的值添加到我计划在我的应用程序中实现的其他一些东西的表值中。

我怎样才能做到这一点?我想继续按照我现在的方式进行操作,使用contentvalues插入方法而不是使用 sqlite 语法(INSERT,SELECT,etc)。这可能吗?因为我在 sqlite 语法上绝对是 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 + "')");

}
4

2 回答 2

0

在 sqlite 中无法将值增加到特定单元格。您必须读取单元格的当前值并将所需的值添加到其中并用旧值替换它。您可以使用更新方法。

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);
}

每次您要向表中添加一行时,您都必须阅读所有行并检查该行是否存在。这是一种检索所有行的方法:

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 是数据库表行的类,包含代表实际表列的字段。通过迭代此列表并获取每个列表的“国家”值,您可以了解该行是否存在。

这些是 sqlite 数据库编程的基本概念。我建议你对这个问题进行一些研究。

于 2013-07-06T09:44:59.627 回答
0

我不知道你的数据库类,但检查这个方法

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

如果您正确创建列,如果存在冲突,则新条目将替换旧条目。

编辑:在您最后评论之后,您只需要更新:首先使用您的项目名称查询您的数据库(仔细检查参数是否正常):

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

这将返回一个有 0 行或 1 行的光标。如果没有行,您可以继续正常插入数据(不要忘记添加您的计数器:第一次插入时为 1):

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

}

如果有 1 行,则您的产品已经在您的数据库中,因此只需迭代光标,获取计数器上的值,在其上添加 +1 并使用此方法更新您的数据库:

public int update (String table, ContentValues values, String whereClause, String[] whereArgs)
于 2013-07-06T09:09:42.510 回答