2015-09-07 131 views
1

我正在使用數據庫處理項目。這個數據庫非常簡單。只有一個表有兩列:id(int)和text(string)。 爲了填補這個基礎,我想創建一個.sql腳本文件。 (這個數據庫不是在android項目中創建的,因爲我想要一個已經填充好的數據庫插入到我的android項目中)如何使用SQLite腳本逐行讀取.txt文件?

我想讓我的腳本創建表,然後讀取帶有字符串值的.txt文件(對於文本列)在每一行上。 對於每一行,它應該將字符串值插入到表中。

我不是很熟悉SQLite和SQL。 我已經找到了一種使用迭代器自動遞增id的方法(但我還沒有測試它),但是我找不到如何逐行讀取.txt文件的方法。

  • 所以我的問題是:是否有可能在SQLite腳本中逐行讀取.txt文件?

  • 如果是,請告訴我該怎麼做。

+1

在過去,我已經解決了與從文本文件創建SQL的(Python)腳本類似的情況下,將所有語句放在數據庫上的.sql文件中。不是直接回答你的問題,而是一個可能的解決方案。 – Kenneth

+1

@Kenneth,我第二個議案。 SQLite是一個數據庫,而不是一種編程語言。 Python和PHP都有SQLite的內置庫。 OP應考慮使用通用語言連接數據庫,打開txt文件,並通過每行文本文件迭代遊標/準備好的查詢。而且,應用程序邏輯通常應該從數據庫中抽象出來。 – Parfait

回答

2

SQLite是一個嵌入式數據庫;它被設計成與一些「真正的」編程語言一起使用。 沒有功能可以訪問和分析文本文件。

你必須用自己喜歡的語言編寫自己的腳本,或者使用一些現有的工具。
如果有保證不會在文本文件中occurr一個字符,你可以使用sqlite3命令行外殼和一個臨時的,一列的表導入:

CREATE TEMP TABLE i(txt); 
.separator ~ 
.import MyFile.txt i 
INSERT INTO TheRealTable(text) SELECT txt FROM i; -- assumes id is autoincrementing 
DROP TABLE i; 
+0

感謝您的回覆。事實上,經過一些研究,Kenneth和Parfait在評論中說過(正如你所說的),不可能只用.sql腳本逐行閱讀.txt文件。我找到了一個創建python腳本的解決方案(這非常容易)讀取文件並填充數據庫。 – Mtoypc

0

您可以使用BufferedReader。該代碼可能看起來像:

InputStream in = context.getResources().openRawResource(R.raw.your_txt_file); 
BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 

String line = null; 
while(null != (line = reader.readLine())){ 
    doStuffWithLine(line); 
} 

reader.close(); 
+0

感謝您的回答,但我忘了確切的說數據庫不在android應用程序中。我想要一個將在命令行中執行的.sql文件,它將填充數據庫。然後我會把數據庫放到我的應用程序中。我現在編輯我的帖子。抱歉。 – Mtoypc

-2

所以我的問題是:是否有可能逐行讀取文本文件行一個SQLite腳本?

是的。

如果是,請告訴我該怎麼做。

我們去那裏:

僞代碼算法:

  1. 打開該文件。
  2. 逐行閱讀並在數據庫中插入新行。
  3. 關閉資源並提交事務。

1)數據庫中按行打開文件

InputStream instream = new FileInputStream("myfilename.txt"); 
InputStreamReader inputreader = new InputStreamReader(instream); 
BufferedReader buffreader = new BufferedReader(inputreader); 

2)讀行,並插入新行

List<String> nameList = new ArrayList<>(); 
String line; 
do { 
    line = buffreader.readLine(); 
    if (line != null){ 
     nameList.add(line); 
    } 
} while (line != null); 

現在你應該插入數據庫中的所有名稱:

storeNamesInDB(nameList); 

private void storeNamesInDB(nameList){ 
    String sql = "INSERT INTO table (col1) VALUES (?)"; 
    db.beginTransaction(); 

    SQLiteStatement stmt = db.compileStatement(sql); 
    for (int i = 0; i < nameList.size(); i++) { 
     stmt.bindString(1, values.get(i)); 
     stmt.execute(); 
     stmt.clearBindings(); 
    } 

    db.setTransactionSuccessful(); 
    db.endTransaction(); 
} 

3)關閉資源

不要忘記關閉資源:

instream.close(); 
inputreader.close(); 

免責聲明! 您不應該複製&粘貼此代碼。將每個var名稱和一些說明替換爲您的項目中有意義的人員。這只是一個想法。