3

皆さんに質問があります。私は、txtファイルからロードされたSQLiteデータベースを部分的に使用するプロジェクトアプリケーションに取り組んでいます(記号で区切られた5つの文字列の約100k〜200k行があります^)。

さて、私の質問は、データベースを扱うのはこれが初めてなので、変更可能なデータベースの.txtインポートはどのように機能するのかということです。私が正しく理解していれば、txtファイルからすべてのデータを一度プルして、作業を続けるデータベースを作成します。データベースを変更するときは、txtではなく新しく作成したデータベースを変更しますか?コードは、アプリが読み込まれるたびにtxtから情報を再度取得しようとしますか?また、毎回200k 10文字の単語を読み込むのは多すぎますか?:)

データベースは、次の形式の音楽バンドで構成されています。名前/ジャンル/人気[はい/いいえ] /選択
済み選択した列は、ユーザー(およびそのことについてはアプリ)によって変更される唯一の列です。txtファイルから実装が追加されたデータベースへの通常のアプローチを使用する場合、選択した列は毎回リセットされますか(それは望ましくありません)?

4

1 に答える 1

4

巨大なtxtファイルを使用してアプリを配布し、ユーザーのデバイスにインポートしないでください。これには時間がかかり、面倒です。

むしろ、事前に入力されたデータベースを使用してアプリを配布し、resフォルダーからコピーします。android-sqlite-asset-helperを使用してこれを自動化できます。

また、はい。データベースは常に内部メモリに保存されており、ルート化されていないデバイスではアクセスできません(AVDを使用している場合を除く)。


txt-contentsをデータベースにインポートするには、コンテンツを解析して対応するSQLクエリを実行するスクリプトなどを作成します。繰り返しになりますが、アプリはrawファイルではなく、データベースに付属している必要があります。


私は少し退屈して、短いPythonスクリプトをハッキングして、txtファイルからすべてのエントリを読み取り、SQLiteデータベースに挿入しました。

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!";

bands.txtこれは、txtファイルに名前が付けられ、各値がaで区切られ、/各エントリが独自の行にあることを前提としています。結果のデータベースファイルはimported.dbです。

また、私INTEGERはすべてのTrue|Falseフィールド(人気のある、選択された)に使用します。これらは、0falseの場合と1trueの場合を保持します。

最後になりましたが、RegExでは-valueに「yes」と「no」のみが許可されますpopular

于 2012-12-26T01:43:06.650 に答える