我有一个只有1列的sqlite数据库,里面填充了一些来自一堆edittexts的名字。我用它来支持自动完成。 我已将数据库设置为该列的唯一,因此我不会在自动完成中获得重复项。 问题是我想做以下事情: 如果有人输入副本,请在数据库中为该名称创建一个计数器。如果我输入“cheese”5次,数据库中的“cheese”将在另一列中有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[] {};
}
}
}
答案 0 :(得分:0)
我不知道这是否是正确的方法,但一个可能的解决方案是:
每次用户输入名称时,或者每次EditText
中的文本发生更改(您可以使用TextWatcher
侦听器监听)时,请按以下方式对数据库进行查询(伪代码):
SELECT ALL FROM countries WHERE country_name = editText.getText()
换句话说,检查countries
表中是否已存在用户正在键入的文本。如果返回的结果为0,则表示从未查询此名称,如果返回的结果大于0,则必须以1为增量提取其关联的计数值。
答案 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;
将visits
替换为countries
,将$ip
替换为country
。这是
INSERT ..... ON DUPLICATE UPDATE ....;