1

値に基づいて1つのテーブル(DATABASE_FAV_EQUIP_TABLE)で情報を検索し、その情報をプルしてから、別のテーブル(DATABASE_EQUIP_TABLE)に配置しようとしています。最初に情報がまだ存在しないかどうかを確認します。私のコードは以下の通りです。クラッシュするものはなく、エラーも発生しませんが、2番目のテーブル(DATABASE_EQUIP_TABLE)に情報が配置されません。私は何度かそれを調べましたが、なぜこれが機能しないのか理解できません。

//takes all equip data from saved equip set, and puts into equip table
public String AddSavedEquipToEquipTable(String name) {

    String[] columns = new String[]{KEY_EQUIP};
    Cursor c = ourDatabase.query(DATABASE_FAV_EQUIP_TABLE, columns, KEY_FAVNAME + "='" + name + "'", null, null, null, null);

    if (c == null){
        return null;
    }
    else if(c != null && c.moveToFirst()) {
        do {

            int iEquip = c.getColumnIndex(KEY_EQUIP);
            String equip = c.getString(iEquip);

            CheckEquipTable(equip);

            c.moveToNext();

            } while (KEY_FAVNAME == name);
        }

    return null;
}


public void CheckEquipTable(String equip){

    String[] columns = new String[]{KEY_EQUIP};
    ContentValues cv = new ContentValues();
    Cursor check = ourDatabase.query(DATABASE_EQUIP_TABLE, columns, KEY_EQUIP + "='" + equip + "'", null, null, null, null);

    if(check == null){              
        cv.put(KEY_EQUIP, equip);
        ourDatabase.insert(DATABASE_EQUIP_TABLE, null, cv);
        }

}
4

2 に答える 2

1

これを試して:

public void AddSavedEquipToEquipTable(String name) {
    String[] columns = new String[]{KEY_EQUIP};
    Cursor c = ourDatabase.query(DATABASE_FAV_EQUIP_TABLE, columns, KEY_FAVNAME + "='" + name + "'", null, null, null, null);

    int iEquip = c.getColumnIndex(KEY_EQUIP);
    while(c.moveToNext())
        CheckEquipTable(c.getString(iEquip));
}

いくつかの変更点について説明します。

  • の列インデックスはKEY_EQUIP変更されないため、インデックスを取得する必要があるのは1回だけです。
  • Javaでは、文字列をnotと比較する必要があります。おそらくfalseです。if(name.equals(KEY_FAVNAME))==(KEY_FAVNAME == name)
  • ourDatabase.query()nullを返すことはなく、最小の結果は空のカーソルになります(のようにcursor.getCount() == 0
  • cursor.moveToNext()true / falseを返し、インデックスが-1の場合、moveToNext()はmoveToFirst()と同じです。また、カーソルが空の場合、moveToNext()はfalseを返します。

私の提案で他の質問を躊躇しないでください。お役に立てば幸いです。

添加

CheckEquipTable()がカーソルが最初にnullかどうかをチェックしていることに気づきませんでした。

if(check == null){

次のように変更します。

if(check.getCount() == 0){              
于 2012-06-28T01:46:03.937 に答える
0

ええと、sqliteだけでこれを行うことができるはずです。テーブル名/列があればもっと助けられますが、基本的にはこのようなクエリを実行します。

INSERT INTO SomeTable(C, D)
SELECT A, B
FROM OtherTable
WHERE NOT EXISTS (
    SELECT 1
    FROM SomeTable 
    WHERE A = C AND B = D 
)
于 2012-06-28T02:12:43.800 に答える