【问题标题】:SQLiteDatabase.execSQL(query) - Multiple SQL commands inside the onCreate() method not working [duplicate]SQLiteDatabase.execSQL(query) - onCreate() 方法中的多个 SQL 命令不起作用 [重复]
【发布时间】:2017-11-06 12:57:58
【问题描述】:

我是安卓新手。我以前没有使用过 SQLite 数据库。
我认为这是一个非常基本的问题,但我无法找到解决方案。

代码在这里(假设声明)

public void onCreate(SQLiteDatabase db) {

    String CREATE_CATEGORIES_TABLE = "CREATE TABLE " + FORMULA + "("
            + CAT_CD + " TEXT ," + S_CAT_CD + " TEXT, PRIMARY 
 KEY(CAT_CD,S_CAT_CD))";
    db.execSQL(CREATE_CATEGORIES_TABLE);

    String CREATE_CAT_DESC_TABLE="CREATE TABLE "+ FORMULA_CAT_DESC + "
("+CAT_CD+" TEXT PRIMARY KEY, "+ DESC +" TEXT ) ";
    db.execSQL(CREATE_CAT_DESC_TABLE);

    String CREATE_CURRENCY_TABLE="CREATE TABLE "+ VI_CURRENCY + "("+ 
CURRENCY_CD +" TEXT PRIMARY KEY, "+ CURRENCY_SIGN +" TEXT ) ";
    db.execSQL(CREATE_CURRENCY_TABLE);

   String query=  "INSERT INTO "+ VI_CURRENCY +" ("+CURRENCY_CD +", 
"+CURRENCY_SIGN+ ") VALUES " +
            "('INR', '₹'), " +
            " ('USD','$') " +
            "('JPY','¥') ";
    db.execSQL(query);
 }

前三个命令执行成功,而执行插入命令,SQLite 抛出异常。

【问题讨论】:

标签: android sqlite android-sqlite sqliteopenhelper


【解决方案1】:

您可以为每条记录创建一个 sql 语句

String query1 =  "INSERT INTO " + VI_CURRENCY + " (" + CURRENCY_CD + ", " + CURRENCY_SIGN + ") VALUES " + "('INR', '₹')" ;

String query2 =  "INSERT INTO " + VI_CURRENCY + " (" + CURRENCY_CD + ", " + CURRENCY_SIGN + ") VALUES " + "('USD','$')" ;

String query3 =  "INSERT INTO " + VI_CURRENCY + " (" + CURRENCY_CD + ", " + CURRENCY_SIGN + ") VALUES " + "('JPY','¥')" ;

db.execSQL(query1);
db.execSQL(query2);
db.execSQL(query3);

或者在一个语句中插入多个值,使用正确的sintax应该是这样的:

String query = "INSERT INTO " + VI_CURRENCY + " (" + CURRENCY_CD + ", " + CURRENCY_SIGN + ") VALUES " +
             "('INR', '₹'), " +
             "('USD','$'), " +
             "('JPY','¥')";
db.execSQL(query);

欲了解更多信息,请访问SqlLite

【讨论】:

  • 我要插入数百条记录 那我应该写数百条查询吗?我认为这不是一个好的解决方案。
  • 我更新了答案,你有语法错误
  • 哦..谢谢。现在 Query 正在成功运行。
【解决方案2】:

在Android中,写入操作很慢,所以在你的情况下,如果你有数百个数据,你可以使用SQLite数据库中的事务。

db.beginTransaction();
try {
    for(/*your loop*/) {
        String query =  /*your query*/

        db.execSQL(query);
    }
    db.setTransactionSuccessful();
} finally {
    db.endTransaction();
}

更多详情,请参考this,官方文档。

【讨论】:

    【解决方案3】:

    如果要插入多条记录,则应在键值对中的 hashmap 对象中获取数据。使用迭代器并在表中插入数据。

            Map<String,String> myMap = new HashMap<>();
            myMap.put("INR","₹");
            myMap.put("USD","$");
            myMap.put("JPY","¥");
    
    
     Iterator it = myMap.entrySet().iterator();
        while (it.hasNext()) {
          Map.Entry pair = (Map.Entry)it.next();
          String query1 =  "INSERT INTO " + VI_CURRENCY + " (" + CURRENCY_CD + ", " + CURRENCY_SIGN + ") VALUES " + "("+ pair.getKey()+ "," + pair.getvalue()+)" ;
        db.execSQL(query1);
        it.remove(); // avoids a ConcurrentModificationException
    }
    

    【讨论】:

      猜你喜欢
      • 2017-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-21
      • 2019-01-28
      • 2016-06-11
      • 1970-01-01
      • 2013-04-12
      相关资源
      最近更新 更多