2015-09-07 3 views
1

Я работаю над проектом с базой данных. Эта база данных очень проста. Существует только одна таблица с двумя столбцами: id (int) и текст (строка). Чтобы заполнить эту базу, я хочу создать файл сценария .sql. (эта база данных не создана внутри андроидного проекта, потому что я хочу, чтобы уже заполненная база данных была вставлена ​​в мой проект андроида)Как читать файл .txt по строкам с помощью сценария SQLite?

Я хочу, чтобы мой скрипт создал таблицу, а затем прочитал .txt-файл со строковым значением (для текстового столбца) для каждой строки. Для каждой строки он должен вставить значение строки в таблицу.

Я не очень хорошо знаком с SQLite и SQL в целом. Я уже нашел способ автоматического увеличения идентификатора с помощью итератора (но я еще не тестировал его), но я не смог найти, как читать файл .txt по строкам.

  • Так что мой вопрос: возможно ли читать .txt-файл по строкам в сценарии SQLite?

  • И если да, не могли бы вы рассказать мне, как это сделать.

+1

В прошлом я решил аналогичные случаи с сценарием (Python), создающим SQL из текстового файла, при этом все операторы в файле .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

Спасибо за ответ. Действительно, после некоторых исследований и, как сказал Кеннет и Парфайт в комментарии (и, как вы сказали), невозможно прочитать файл .txt по строкам только с помощью сценария .sql. Я нашел решение, создающее скрипт 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

Так что мой вопрос: Можно ли читать .txt строку за строкой в ​​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 и некоторые инструкции тем, кто имеет смысл в вашем проекте. Это всего лишь идея.