尝试从资产读取转储文件时换行的SQLiteException语法错误

时间:2016-01-20 08:12:51

标签: android sqlite assets

我正在开发一个Android应用,我在 assets 中有一个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:near“(”:语法错误(代码   1):,编译时:CREATE TABLE [tblType](

如果我删除第一个换行符,我会得到:

  

android.database.sqlite.SQLiteException:near“,”:语法错误(代码   1):,编译时:CREATE TABLE [tblType]([IdType] INTEGER NOT   在冲突回滚的冲突回滚主键上为NULL   AUTOINCREMENT,

正如我所说,这是一个大型转储,我不能手动删除所有的换行符;所以问题是,是否有任何方式可以使配置或额外代码使Android忽略换行符?

这是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 个答案:

答案 0 :(得分:0)

您正在逐行读取文件。这对于具有多行的SQL语句不起作用。

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