如何将SQLite数据库嵌入到应用程序中?

时间:2011-04-11 20:17:54

标签: android sqlite import

我认为我有一些基本的理解问题,所以也许有人能够提供帮助: - )

我正在使用Eclipse开发一个Android应用程序,这个应用程序将使用一个数据库(只能从数据库读取)。该数据库包含大约4,000个条目,即不能通过源代码创建和填充数据库。因此,我已事先创建了数据库及其所有记录。

但是,如何将此数据库文件“嵌入”到我的应用程序中然后访问它?数据库的文件大小约为500 kB。从远程服务器下载也不是一种选择,因为这是不允许的。

谢谢, 罗伯特

4 个答案:

答案 0 :(得分:26)

我通过以下方式解决了这个问题:

  1. file.db添加到项目/资产文件夹中;

  2. 写下一堂课:

    public class LinnaeusDatabase extends SQLiteOpenHelper{
    
        private static String DATABASE_NAME = "Dragonfly.db";
        public final static String DATABASE_PATH = "/data/data/com.kan.linnaeus/databases/";
        private static final int DATABASE_VERSION = 1;
    
        private SQLiteDatabase dataBase;
        private final Context dbContext;
    
        public LinnaeusDatabase(Context context) {
            super(context, DBActivity.DatabaseName, null, DATABASE_VERSION);
            this.dbContext = context;
            DATABASE_NAME = DBActivity.DatabaseName;
            // checking database and open it if exists
            if (checkDataBase()) {
                openDataBase();
            } else
            {
                try {
                    this.getReadableDatabase();
                    copyDataBase();
                    this.close();
                    openDataBase();
    
                } catch (IOException e) {
                    throw new Error("Error copying database");
                }
                Toast.makeText(context, "Initial database is created", Toast.LENGTH_LONG).show();
            }
        }
    
        private void copyDataBase() throws IOException{
            InputStream myInput = dbContext.getAssets().open(DATABASE_NAME);
            String outFileName = DATABASE_PATH + DATABASE_NAME;
            OutputStream myOutput = new FileOutputStream(outFileName);
    
            byte[] buffer = new byte[1024];
            int length;
            while ((length = myInput.read(buffer))>0){
                myOutput.write(buffer, 0, length);
            }
    
            myOutput.flush();
            myOutput.close();
            myInput.close();
        }
    
        public void openDataBase() throws SQLException {
            String dbPath = DATABASE_PATH + DATABASE_NAME;
            dataBase = SQLiteDatabase.openDatabase(dbPath, null, SQLiteDatabase.OPEN_READWRITE);
        }
    
        private boolean checkDataBase() {
            SQLiteDatabase checkDB = null;
            boolean exist = false;
            try {
                String dbPath = DATABASE_PATH + DATABASE_NAME;
                checkDB = SQLiteDatabase.openDatabase(dbPath, null,
                SQLiteDatabase.OPEN_READONLY);
            } catch (SQLiteException e) {
                Log.v("db log", "database does't exist");
            }
    
            if (checkDB != null) {
                exist = true;
                checkDB.close();
            }
            return exist;
        }
    }
    

答案 1 :(得分:14)

ReignDesign博客上标题为Using your own SQLite database in Android applications的精彩文章。基本上你预先创建你的数据库,把它放在apk的assets目录中,然后首先使用copy到“/ data / data / YOUR_PACKAGE / databases /”目录。

答案 2 :(得分:10)

我过去通过在res/raw资源中的应用程序中存储JSON文件然后在第一次加载时加载文件来完成此操作。从那里,您可以使用批量插入模式批量导入条目。请参阅my database loader for Units作为此技术的示例。 res/raw样式的一个好处是您可以使用Android资源选择系统将数据本地化到不同的区域,因此您可以为不同的语言或区域使用不同的数据库(或其中一部分)。

您还可以将原始SQL转储放在类似的文件中,并在首次加载时加载它。您可以使用openRawResource(int)从资源中获取文件。我建议这样做,而不是存储预先制作的sqlite数据库文件,以增加sqlite版本之间的兼容性,以及使数据库维护更容易(从应用程序开发生命周期POV)。

批量加载时,请确保使用事务,因为这样可以加快速度并使加载更加可靠。

答案 3 :(得分:4)

在对this answer的评论中,CommonsWare建议不要使用@evilone在此提出的相同方法(即,自己从资产中复制数据库)。相反,你应该使用久经考验的SQLiteAssetHelper。我已在Android Studio中使用它,效果很好。

directions相当清楚。以下是一些关键摘录:

  

如果您使用的是Gradle构建系统,只需添加以下内容即可   build.gradle文件中的依赖关系:

dependencies {
    compile 'com.readystatesoftware.sqliteasset:sqliteassethelper:+'
}
  

像往常一样SQLiteAssetHelper延长SQLiteOpenHelper,   为构造函数提供数据库名称和版本号:

public class MyDatabase extends SQLiteAssetHelper {

    private static final String DATABASE_NAME = "northwind.db";
    private static final int DATABASE_VERSION = 1;

    public MyDatabase(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
}

将您的数据库放在assets/databases/northwind.db中(使用您拥有的任何数据库名称)。

  

数据库第一次可供使用   getReadableDatabase()getWritableDatabase()被调用。