我认为我有一些基本的理解问题,所以也许有人能够提供帮助: - )
我正在使用Eclipse开发一个Android应用程序,这个应用程序将使用一个数据库(只能从数据库读取)。该数据库包含大约4,000个条目,即不能通过源代码创建和填充数据库。因此,我已事先创建了数据库及其所有记录。
但是,如何将此数据库文件“嵌入”到我的应用程序中然后访问它?数据库的文件大小约为500 kB。从远程服务器下载也不是一种选择,因为这是不允许的。
谢谢, 罗伯特
答案 0 :(得分:26)
我通过以下方式解决了这个问题:
将file.db
添加到项目/资产文件夹中;
写下一堂课:
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()
被调用。