代码之家  ›  专栏  ›  技术社区  ›  Ghasem

试图从资产中读取转储文件时换行出现SQLiteException语法错误

  •  0
  • Ghasem  · 技术社区  · 10 年前

    我正在开发 Android 我有一个应用程序 SQLite 转储文件 资产 我正在尝试使用该转储在用户的手机中创建一个数据库。

    问题是,这是一个包含sql命令的长转储文件,其中包含如下换行符:

    CREATE TABLE [tblType] (
      [IdType] INTEGER NOT NULL ON CONFLICT ROLLBACK PRIMARY KEY ON CONFLICT ROLLBACK AUTOINCREMENT, 
      [Type] NVARCHAR);
    

    所以当我尝试使用 SQLiteOpenHelper :

    SQLiteOpenHelper openHelper0 = new DbHelper(this);
    
    Cursor cu = null;
    try {
        cu = openHelper0.getReadableDatabase().rawQuery("select IdWord,Word from tblWord", null);
    } catch (Exception e) {
        e.printStackTrace();
    }
    

    我在每一行都会出现语法错误,包括换行符:

    android.database.sqlite。SQLiteException:接近“(”:语法错误(代码 1) :,编译时:CREATE TABLE[tblType](

    如果我去掉第一个换行符,我会得到:

    android.database.sqlite。SQLiteException:接近“,”:语法错误(代码 1) :,编译时:CREATE TABLE[tblType]([IdType]INTEGER NOT 冲突回滚主键为空 自动递增,

    正如我所说,这是一个大型转储,我无法手动删除所有换行符;所以问题是,有没有类似配置或额外代码的方法 安卓 忽略换行符?

    这是来自 DBHelper :

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        try {
            InputStream is = activity.getAssets().open("am.sql");
            Scanner scanner = new Scanner(is).useDelimiter("\n");
    
            while (scanner.hasNext()) {
                sqLiteDatabase.execSQL(scanner.next());
            }
            is.close();
        } catch (IOException ex){
    
        }
    }
    
    1 回复  |  直到 10 年前
        1
  •  0
  •   CL.    10 年前

    你正在逐行阅读文件。这不适用于具有多行的SQL语句。

    如果没有任何包含嵌入分号的SQL语句(触发器或换行符前带有分号的文本值),则可以在行尾使用分号来检测语句的实际结尾。