0

我有一个只有 1 列的 sqlite 数据库,其中填充了我从一堆编辑文本中获得的一些名称。我正在使用它来驱动自动完成。我已将数据库设置为该列的唯一数据库,因此我不会在自动完成中出现重复项。问题是我想做以下内容:如果有人输入重复项,请在数据库中为该名称创建一个计数器。所以如果我输入“奶酪”5次,数据库中的“奶酪”将有 5 个不同的列。我想要实现的是显示最常首先使用的自动完成功能,并且还有某种“最常用的名称”列表视图或其他东西。你能帮我一个片段吗?我如何检测它何时尝试将副本输入数据库并增加计数器?谢谢 !到目前为止,这是我的代码。

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[] {};
    }
}

}

4

2 回答 2

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和。$ip_ country这是 SQLite 的等价物

INSERT ..... ON DUPLICATE UPDATE ....;
于 2013-06-30T01:11:12.967 回答
0

我不知道这是否是正确的做法,但一个潜在的解决方案可能是:每次用户输入名称,或者每次EditText更改文本时(您可以使用TextWatcher侦听器收听),进行查询通过以下方式(伪代码)到数据库:

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

换句话说,检查countries表中是否已经是用户正在输入的文本。如果返回结果为 0,则说明该名称从未被查询过,如果返回结果大于 0,则必须提取其关联的计数值以 1 递增。

于 2013-06-30T00:38:08.427 回答