Android:Sqlite-将值从一个表移动到另一个表

Android:Sqlite-将值从一个表移动到另一个表,android,sqlite,Android,Sqlite,我试图根据一个值在一个表(DATABASE_FAV_equipment_表)中搜索信息,提取该信息,然后将其放入另一个表(DATABASE_equipment_表)-首先检查它是否已经存在。我的代码如下。没有崩溃,我也没有收到任何错误,但是没有任何信息被放入第二个表(数据库表)。我已经检查过好几次了,不明白为什么这不起作用 //takes all equip data from saved equip set, and puts into equip table public String Ad

我试图根据一个值在一个表(DATABASE_FAV_equipment_表)中搜索信息,提取该信息,然后将其放入另一个表(DATABASE_equipment_表)-首先检查它是否已经存在。我的代码如下。没有崩溃,我也没有收到任何错误,但是没有任何信息被放入第二个表(数据库表)。我已经检查过好几次了,不明白为什么这不起作用

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

}
试试这个:

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));
}
我将解释一些变化:

  • 键的列索引不会更改,因此我们只需检索一次索引
  • 在Java中,如果(name.equals(KEY\FAVNAME))不是
    =
    (KEY\FAVNAME==name)
    则必须将字符串与
    进行比较
  • ourDatabase.query()
  • cursor.moveToNext()
    返回true/false,当索引位于-1时,moveToNext()与moveToFirst()相同。此外,如果光标为空,则moveToNext()返回false
对我的建议还有其他问题,请不要犹豫。希望有帮助

添加

我没有注意到CheckEquipTable()第一次检查光标是否为null:

if(check == null){
这样改变它:

if(check.getCount() == 0){              
试试这个:

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));
}
我将解释一些变化:

  • 键的列索引不会更改,因此我们只需检索一次索引
  • 在Java中,如果(name.equals(KEY\FAVNAME))不是
    =
    (KEY\FAVNAME==name)
    则必须将字符串与
    进行比较
  • ourDatabase.query()
  • cursor.moveToNext()
    返回true/false,当索引位于-1时,moveToNext()与moveToFirst()相同。此外,如果光标为空,则moveToNext()返回false
对我的建议还有其他问题,请不要犹豫。希望有帮助

添加

我没有注意到CheckEquipTable()第一次检查光标是否为null:

if(check == null){
这样改变它:

if(check.getCount() == 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 
)

嗯,您应该能够在sqlite中单独完成这项工作。如果我有表名/列,我可以提供更多帮助,但您基本上可以执行这样的查询

INSERT INTO SomeTable(C, D)
SELECT A, B
FROM OtherTable
WHERE NOT EXISTS (
    SELECT 1
    FROM SomeTable 
    WHERE A = C AND B = D 
)

我只是试着用它来替换我的代码,但是它仍然没有把任何东西放到第二个数据库中。对不起,我仍然不善于阅读日志。我所看到的唯一有意义的事情是光标没有最终确定或关闭。但它没有显示为错误或任何东西。我添加了一个更新。关闭光标很简单,只需在两个函数结束时调用
c.close()
。我仍在查看您编辑的答案…但出于好奇,是否有必要每次关闭光标?这可以防止浪费内存,这意味着应用程序速度更快。你在为什么API编程(API 10或更高版本)?刚刚尝试用它替换我的代码,但它仍然没有将任何内容放入第二个数据库。对不起,我仍然很难读取logcat。我所看到的唯一有意义的事情是光标没有最终确定或关闭。但它没有显示为错误或任何东西。我添加了一个更新。关闭光标很简单,只需在两个函数结束时调用
c.close()
。我仍在查看您编辑的答案…但出于好奇,是否有必要每次关闭光标?这可以防止浪费内存,这意味着应用程序速度更快。您为什么API编程(API 10或更高版本)?