gpt4 book ai didi

java - SQLite : Unique makes my database go crazy

转载 作者:行者123 更新时间:2023-12-01 18:46:40 25 4
gpt4 key购买 nike

我的应用程序出现问题。我的应用程序所做的是:从几个编辑文本(每行 3 个,动态创建)获取一些数据并将它们放入数据库中。

我希望数据库做的是这样的:获取产品名称数量价格并将它们放入表中.名称应该是UNIQUE(它将用于自动完成,它需要是唯一的,以便在AC列表中不重复)。数据库中的价格必须是最后插入的价格该产品(例如,如果插入 3 美元的奶酪,然后在数据库中插入 2.5 美元的奶酪,我们将找到 2.5 美元)。必须对数量求和(如果我在数据库中输入数量为 3 的奶酪,然后再次输入数量为 4 的奶酪,我们将找到 7)。

现在,我的问题:假设我将其输入到我的购物 list 中:

 1.     Hhhh    4   2.5
2. Dddd 3 1
3. Eeee 2 2
4. Aaaa 5 3.5

在我的数据库中我会找到这个:

4.      Aaaa    4   2.5
2. Dddd 3 1
3. Eeee 2 2
1. Hhhh 5 3.5

所以,问题是它按字母顺序排列产品名称列,但其他列保持相同的顺序,即我在编辑文本中输入的顺序。我做了一些测试,如果我从产品名称列中删除 UNIQUE ,它会按应有的方式输入它,但当然,它会创建重复项,这是我不需要的。我不需要明白了,有什么问题吗?为什么 UNIQUE 会触发这个?

这是我的代码:

我的表创建:

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


private static final String DB_CREATE_SCRIPT = "create table "
+ DB_TABLE_NAME
+ " (_id INTEGER PRIMARY KEY,country_name text unique, country_quantity REAL DEFAULT '0',country_price REAL);) ";

private SQLiteDatabase sqliteDBInstance = null;

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

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

我的插入方法:

public void insertCountry(String countryName, String countryPrice,
String countryQuantity) {

sqliteDBInstance.execSQL("INSERT OR IGNORE INTO " + DB_TABLE_NAME
+ "(country_name, country_quantity, country_price) VALUES('"
+ countryName + "','0', '" + countryPrice + "')");

sqliteDBInstance.execSQL("UPDATE " + DB_TABLE_NAME
+ " SET country_name='" + countryName
+ "', country_quantity=country_quantity+'" + countryQuantity
+ "' WHERE country_name='" + countryName + "';");

sqliteDBInstance.execSQL("UPDATE " + DB_TABLE_NAME
+ " SET country_name='" + countryName + "', country_price='"
+ countryPrice + "' WHERE country_name='" + countryName + "';");
}

这就是我调用插入方法的方式:

    for (int g = 0; g < allcant.size() - 1; g++) {
if (prod[g] != "0.0") {
sqlliteCountryAssistant.insertCountry(prod[g],pret[g],cant[g]);
}

另外,请原谅我乱七八糟的代码,一个月前我就开始学习Android,没有任何编程背景。我刚刚获得社会学学士学位,所以是的,我是一个绝对的初学者。如果有办法的话它比我做的更好,我很确定有,请给我指路,呵呵。

谢谢,祝你有美好的一天!

编辑:Aaa和整个数据库类:

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

private static final String DB_CREATE_SCRIPT = "create table "
+ DB_TABLE_NAME
+ " ( id INTEGER PRIMARY KEY AUTOINCREMENT,country_name text unique, country_quantity REAL DEFAULT '0',country_price REAL)";

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 void insertCountry(String countryName, String countryPrice,
String countryQuantity) {
ContentValues cv = new ContentValues();
cv.put("country_name", countryName);
cv.put("country_price", countryPrice);
sqliteDBInstance.insertWithOnConflict(DB_TABLE_NAME, null, cv, sqliteDBInstance.CONFLICT_IGNORE);

// Increment the quantity field (there isn't a good way to do this with sql.update() )
sqliteDBInstance.execSQL("UPDATE " + DB_TABLE_NAME + " SET country_quantity=country_quantity+? WHERE country_name=?",
new Object[] { new Long(countryQuantity), countryName });








/*sqliteDBInstance.execSQL("INSERT OR IGNORE INTO " + DB_TABLE_NAME
+ "(country_name) VALUES('" + countryName + "')");

sqliteDBInstance.execSQL("UPDATE " + DB_TABLE_NAME
+ " SET country_quantity=country_quantity+" + countryQuantity
+ " WHERE country_name='" + countryName + "';");

sqliteDBInstance.execSQL("UPDATE " + DB_TABLE_NAME
+ " SET country_price=" + countryPrice
+ " WHERE country_name='" + countryName + "';");*/
}

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()];
// String[] strpri = new String[cursor.getCount()];
int i = 0;

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

}

最佳答案

我还没弄清楚这个疯狂的顺序,但我发现了两件事甚至可能澄清一些事情:

  1. 你的建表sql有一个右括号太多(去掉分号后面的那个)
  2. 你的插入方法真的很困惑:)我会把它分成两个方法。

一般方法是创建一个 insertOrUpdate 方法来查询数据库中的条目(在您的情况下为国家/地区名称)。如果条目存在,则将更新该条目,如果不存在,则将插入该条目。由于您是初学者,这可能是您自己完成的一项好任务,您应该在不同的问题中获得有关 SO 的基本代码。

最后的提示(您可能已经看到了):使用数据库中的参数版本和/或真正的更新/插入方法。

db.insert(TABLE_NAME, null, contentValues); // see class ContentValues for details

根据execSQL()方法,您不应该将其用于任何 SELECT/INSERT/UPDATE/DELETE 语句:

Execute a single SQL statement that is NOT a SELECT/INSERT/UPDATE/DELETE.

现在我的问题哪个答案可以帮助我帮助你:
我还想知道你是如何验证数据库内容的顺序的?您是否在 Android 代码中创建了查询内容的查询,或者是否使用 SQLite 管理器工具打开了 db 文件?如果您查询,您是否也可以在问题中包含您的查询/显示代码?

关于java - SQLite : Unique makes my database go crazy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17536159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com