3

我有一个问题要问你们。我一直在开发一个项目应用程序,该应用程序的一部分使用从 txt 文件加载的 SQLite 数据库(它有大约 100k-200k 行,由^符号分隔的 5 个字符串)。

现在我的问题是,由于这是我第一次使用数据库,可修改数据库的 .txt 导入如何工作?如果我理解正确,它会从 txt 文件中提取所有数据并创建一个可以继续工作的数据库,所以当我修改数据库时,我会修改新创建的数据库而不是 txt?每当应用程序加载时,代码是否会尝试再次从 txt 中提取信息,并且每次加载 200k 10char 单词是否太多?:)

数据库由以下格式的音乐乐队组成:名称/流派/流行[是/否]/选定
选定的列是唯一由用户修改的列(以及与此相关的应用程序)。如果我对数据库使用常规方法并从 txt 文件中添加了实现,那么每次都会重置所选列(不希望这样)?

4

1 回答 1

4

不要使用巨大的 txt 文件分发您的应用程序并将其导入用户设备。这需要时间并且很烦人。

而是使用预填充的数据库分发您的应用程序,然后从res-folder 复制它。您可以使用android-sqlite-asset-helper自动执行此操作。

另外,是的。数据库始终存储在内部存储器中,您无法在非根设备上访问它(除非您使用的是 AVD)。


要将您的 txt 内容导入数据库,请创建一个脚本或其他东西来解析内容并执行相应的 SQL 查询。同样,您的应用程序应该附带数据库,而不是原始文件!


我有点无聊,编写了一个简短的 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!";

这将假定 txt 文件名为bands.txt,每个值都由 a 分隔,/并且每个条目都将在它自己的行上。生成的数据库文件是imported.db.

此外,我使用INTEGER所有True|False- 字段(流行的,选定的)。然后这些将持有 a0为假和 a1为真。

最后但同样重要的是,RegEx 仅允许 -value 使用“yes”和“no” popular

于 2012-12-26T01:43:06.650 回答