0

アプリに問題があります。私のアプリが行うことは次のとおりです。いくつかの編集テキスト(行ごとに3つ、動的に作成)からデータを取得し、それらをデータベースに配置します。

データベースに実行させたいことは次のとおりです。product name、thequantityおよび thepriceを取り、それらをテーブルに入れますUNIQUE。 ). データベースの価格は、その製品に挿入された最後の価格でなければなりません (たとえば、Cheese3$ が挿入され、その後Cheeseデータベースに 2.5$ が挿入された場合、2.5$ が見つかります)。数量は合計する必要があります(データベースにチーズを数量 3 に入力し、次にチーズを数量 4 に入力すると、7 が見つかります)。

さて、私の問題:買い物リストにこれを入力するとしましょう:

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

また、乱雑なコードをお許しください。私は 1 か月前のようにプログラミングのバックグラウンドなしで Android の学習を開始しました。社会学の学士号を取得したばかりなので、まったくの初心者です。私はやったし、そこにあると確信しています。道を教えてください。

ありがとう、良い一日を!

編集:Aaaand全体のdbクラス:

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

}
4

2 に答える 2

2

私は狂った順序を理解していませんが、何かを解決するかもしれない2つのことを見つけました:

  1. create table sqlには1つの閉じ括弧が多すぎます(セミコロンの後のものを削除してください)
  2. あなたの挿入メソッドは本当に面倒です:)私はそれを2つのメソッドに分割します。

一般的なアプローチは、データベースにエントリ (この場合は countryName) を照会する insertOrUpdate メソッドを作成することです。エントリが存在する場合は更新され、存在しない場合は挿入されます。あなたは初心者なので、これは自分で行うのに適した作業である可能性があります.SOのさまざまな質問で基本的なコードを取得する必要があります.

最後のヒント (既にご覧になっているかもしれません): パラメータ version および/またはデータベースからの実際の update/insert メソッドを使用してください。

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

execSQL()メソッドによると、SELECT/INSERT/UPDATE/DELETE ステートメントには使用しないでください。

SELECT/INSERT/UPDATE/DELETE ではない単一の SQL ステートメントを実行します。

さて、私の質問は、どの答えがあなたを助けるのに役立つでしょうか:
データベースコンテンツの順序をどのように確認したかについても知りたいですか? Android コードでコンテンツをクエリするクエリを作成しましたか、または SQLite マネージャー ツールで db ファイルを開きましたか? クエリを実行する場合、クエリ/表示コードも質問に含めることができますか?

于 2013-07-09T00:10:10.463 に答える