【问题标题】:Creating initial SQLiteDatabase when app is installed安装应用程序时创建初始 SQLiteDatabase
【发布时间】:2010-06-22 00:17:52
【问题描述】:

我正在编写一个显示有趣事实(以及它们的来源)的应用程序。用户可以一一浏览事实。

这是我想到的设计:
在 SQLiteDatabase 中创建一个表,其中包含一个存储有趣事实的文本列和一个存储其源的第二列。 (不确定这是否是最好的方法,但我希望即使没有网络也能使用该应用程序)

我的问题是,当最初在设备上创建数据库时,我是否应该从代码中手动填充数据库,类似于以下伪代码:-

    @Override
public void onCreate(SQLiteDatabase db) {

    //Create the table

    //Populate the table
        //Insert statement 1
        //Insert statement 2
        //Insert statement 3
                          ...
        //Insert statement 500

}

在安装应用程序时,肯定有更好的方法来创建初始数据库吗?

【问题讨论】:

    标签: android database sqlite


    【解决方案1】:

    你确定你真的需要一个数据库吗?这不只是给如此微不足道的事情增加了不必要的开销吗?

    您不能只在代码中声明数组,还是我遗漏了什么?无论是在数据库中还是在您的代码中,它都在占用空间。 db 会为此增加一些开销,并且需要一些时间来加载,而且您的代码必须处理错误等。

    在你的代码中声明一个简单的数组不是更好吗?还是我遗漏了一些明显的东西? (也许用户可以 d/l 一个新的数据库?但这是否比 d/ling 一个新程序的开销要大得多?)

    如果我不同意,请解释(而不是投反对票)。我想帮忙


    编辑:大概您已经在某些地方掌握了事实?也许在文本文件中?您可以只编写代码来解析它并初始化和数组(或填充数据库)。它基本上应该是一个简短的 for 循环。

    【讨论】:

    • 您好,感谢您抽出宝贵时间回答问题。每个事实都有一个来源。所以我想到了一个 2 列的表(包括 id 的 3 列)。我想跟踪 id 以便用户下次访问该应用程序时,它会显示下一个事实,从它停止的地方开始,而不是再次显示第一个事实。我想我可以做一个二维数组,并跟踪它在首选项中被遗漏的索引号。不确定最好的设计解决方案是什么。希望我的回答有意义。
    • 我同意 LeonixSolutions。你在某处有你的事实。如果它已经是文本表单(csv、xml 等),您可以将该文件放在 res/raw 目录中,并且在安装后可用于您的应用程序以直接使用或填充您的数据库。
    【解决方案2】:

    使用派生自 SQLiteOpenHelper 的类

    我已经在我的博客 www.xenonite.net 上写过这件事

    public class myDatabase extends SQLiteOpenHelper
    {
        private static final String     DB_NAME     = "database.db";
        private static final int    DB_VERSION  = 1;
    
        public MyDatabase(Context context)
        {
            super(context, DB_NAME, null, DB_VERSION);
        }
    
        @Override
        public void onCreate(SQLiteDatabase db)
        {
            db.execSQL("CREATE TABLE tbl_test ( id INTEGER PRIMARY KEY AUTOINCREMENT, test TEXT NOT NULL )");
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
        {
            db.execSQL("DROP TABLE IF EXISTS tbl_test");
            onCreate(db);
        }
    }
    

    你可以这样使用

    myDatabase db = new myDatabase(getApplicationContext());
    
    sql = "INSERT INTO tbl_test (test) VALUES ('xyz')";
    db.getWritableDatabase().execSQL(sql);
    
    String sql = "SELECT id FROM tbl_test"; 
    Cursor result = db.getWritableDatabase().rawQuery(sql, null);
    
    int value;
    
    while(result.moveToNext())
    {
            value = result.getInt(0);
    }
    

    在每次调用 db 时,都会调用 myDatabase.onCreate(),因此您的数据库将在第一次运行时创建。更改表结构时,执行 onUpgrade() 并递增 DB_VERSION

    【讨论】:

      猜你喜欢
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多