2012-12-25 4 views
3

나는 너희들에게 질문이있다. 저는 한 부분에서 txt 파일 (SQLite 데이터베이스는 ^ 기호로 구분 된 약 100k-200k 행의 5 문자열)을 사용하는 프로젝트 응용 프로그램에서 작업했습니다.수정 가능한 안드로이드 데이터베이스의 .txt

지금 내 질문은이 데이터베이스를 처음 사용하기 때문에 수정 가능한 데이터베이스의 .txt 가져 오기가 어떻게 작동합니까? 내가 이해한다면, 그것은 txt 파일에서 모든 데이터를 한 번 가져오고 작업을 계속하는 데이터베이스를 만듭니다. 그래서 데이터베이스를 수정할 때 txt가 아니라 새로 생성 된 것을 수정합니까? 앱이로드 될 때마다 코드가 txt에서 정보를 다시 가져 오려고 시도 할 때마다 매번 200k 10 문자 단어를로드하는 것이 너무 많을까요? :)

데이터베이스는이 형식으로 음악 밴드를 구성하지 : 이름/장르/인기 [예/아니오]/
선택된 열은 단 한 사용자 (및 그 문제에 대한 응용 프로그램)에 의해 수정되는 선택 . txt 파일에서 구현이 추가 된 데이터베이스에 대한 일반적인 접근 방법을 사용하면 매번 선택한 열이 재설정됩니다 (원하지 않습니까?).

+1

답변은 프로그램에 달려 있습니다. 분명히 끊임없이 재창조하는 것은 바람직하지 않으므로 그렇게 쓰지 말고 대신 논리를 작성하여 작성하기 전에 존재하는지 확인하십시오. 업그레이드 된 응용 프로그램과 함께 수정 된 원본을 배포 할 수 있다면 더 복잡해 지겠지만 업그레이드 변경 사항을 사용자의 로컬 변경 내용과 병합하는 논리가 필요할 수도 있습니다. –

+0

빠른 답장을 보내 주셔서 감사합니다! 하지만 어떻게하면 txt 파일을 잊어 버리는가? 예를 들어 업데이트가 생길 때까지? (btw,로드 된 SQLite db는 항상 내부 메모리에 저장됩니까?) – murtaugh

+0

일반적으로 ['SQLiteOpenHelper'] (http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper)의 구현을 사용합니다. html). 예를 들어보십시오 [여기] (http : //www.vogella.co.kr/articles/AndroidSQLite/article.html # sqliteoverview_sqliteopenhelper) 또는 [여기] (http://developer.android.com/guide/topics/data/data-storage.html#db)를 클릭하십시오. – JimmyB

답변

4

거대한 txt 파일로 앱을 배포하고 사용자 기기로 가져 오지 마십시오. 이것은 시간이 걸리고 성가신 일입니다.

미리 채워진 데이터베이스로 앱을 배포하고 res- 폴더에서 복사하십시오. 이것을 android-sqlite-asset-helper으로 자동화 할 수 있습니다.

또한 예. 데이터베이스는 항상 내부 메모리에 저장되며 루트가 아닌 장치에서 액세스 할 수 없습니다 (AVD를 사용하지 않는 경우).


는 데이터베이스로 TXT-내용을 가져올 내용을 분석하고 대응하는 SQL-쿼리를 실행하는 스크립트 또는 무언가를 만듭니다. 다시 말하지만, 응용 프로그램은 원시 파일이 아닌 데이터베이스와 함께 제공되어야합니다!

import sqlite3 
import re 

counter = 0; 
pattern = re.compile('^([^\^]+)\^([\w\s]+)\^(yes|no)\^\w+$'); 
conn = sqlite3.connect("imported.db"); 
cursor = conn.cursor(); 
# Create the Table: 
conn.execute(''' 
    CREATE TABLE Bands (
     name TEXT, 
     genre TEXT, 
     popular INTEGER, 
     selected INTEGER 
    );'''); 

# Now, insert: 
with open('bands.txt', 'r') as f: 
    for line in f: 
    match = pattern.search(line); 
    if match: 
      cursor.execute(''' 
      INSERT INTO Bands (name, genre, popular, selected) 
      VALUES (?,?,?,0)''', 
      (
       match.group(1), match.group(2), 
       (1 if match.group(3) == 'yes' else 0) 
      ) 
     ); 
     counter+=1; 



conn.commit(); 
conn.close(); 
print "Imported ", counter, " bands!"; 

이것은 TXT 있다고 가정합니다 :


는 좀 지루했고 함께 당신의 TXT 파일에서 모든 항목을 읽고 SQLite는 데이터베이스에 삽입하는 간단한 파이썬 스크립트를 해킹 -file의 이름은 bands.txt이고, 각 값은 /으로 구분되며 각 항목은 자체 행에 있습니다. 결과 데이터베이스 파일은 imported.db입니다.

또한 True|False -fields (popular, selected)에 모두 INTEGER을 사용합니다. 이 경우에는 거짓 일 경우 0이고 참이면 1입니다.

RegEx는 popular 값에 대해서만 "예"와 "아니오"를 허용합니다.

+0

답장을 보내 주셔서 감사합니다! 처음에는 내 목록에서 아무 것도 선택되지 않기 때문에 선택한 열을 삭제하고 코드에서 0을 삽입한다고 생각했습니다. 장르는 숫자로도 표시됩니다. 그리고 파이썬에 대해 많이 알지 못하기 때문에 어떻게 코드를 시작해야합니까? :) (나를 비난하지 마라, 나는 여전히 학생이다 :) – murtaugh

+0

'[Band Name]/[Genre Name, ID, whatever]/[popular : yes]의 형태로 데이터베이스에 원하는 것을 넣으면된다. "또는"no "]/[selected]'. 스크립트는 파일에서 내용을 무시하고 모든 항목에 대해'selected'를'0'으로 설정합니다. 스크립트를 시작하고, python을 설치하고,'sqlite_import.py'에 코드를 복사하고 (명령 줄/터미널에서)'python sqlite_import.py'라고 쓰십시오. –

+0

그리고 밴드 이름에'/'가 있으면? (예 : AC/DC) – murtaugh

관련 문제