2016-01-20 49 views
0

我開發一個應用程序Android這在我在資產一個SQLite轉儲文件,我試圖創建使用轉儲在用戶的電話數據庫轉儲文件。SQLiteException語法錯誤打破試圖讀取從資產

問題是,它是一個包含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:近 「(」:SY ntax錯誤(代碼 1),而編譯:CREATE TABLE [tblType(

如果我刪除第一線斷線,我得到:

android.database.sqlite.SQLiteException:近「」:語法錯誤(代碼 1):在編譯:CREATE TABLE [tblType]([IdType] INTEGER NOT NULL ON CONFLICT ROLLBACK PRIMARY KEY ON CONFLICT ROLLBACK AUTOINCREMENT,

正如我說這是一個很大的轉儲,我不能手動刪除所有的linebreaks;所以問題是有沒有像配置或額外的代碼,使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){ 

    } 
} 

回答

0

您正在閱讀的行的文件行。這對於具有多行的SQL語句不起作用。

如果您沒有任何包含嵌入式分號(觸發器或帶有分號的文本值在換行符之前的文本值)的SQL語句,您可以在行尾使用分號來檢測語句的實際結尾。

+0

如果我在表格內容中有一些';'會怎麼樣? –

+0

緊接着換行符?然後你必須解析SQL。 –

+0

因此,如果內容中的';'沒有跟着換行,我可以使用'; \ n'作爲分隔符,比如'new Scanner(is).useDelimiter(「; \ n」);'? –

相關問題