我已经预建了大部分字符串对象的数据库。我想知道如何放入我的apk文件,以便在用户安装数据库时已经创建了数据库。如何将现有数据库放在.apk文件中?
回答
我找到的一个很好的例子:Using your own SQLite database in Android applications
基本上,你所创建的数据库导出为一个SQL文件,并将其存储在资产的文件夹。 在第一次程序启动时,将文件的数据导入到最终数据库中。
我认为这是最好的方法,但是你的数据会在apk和数据库中出现两次,使用更多的存储空间。
我刚刚开始为Android开发,惊奇地发现绑定一个静态数据库是不容易的。所以我做了唯一合理的事情:创建了一个能够做到这一点的图书馆。用法示例:
import android.database.sqlite.SQLiteDatabase;
import kiwidrew.staticdb.StaticDatabase;
public class BlahBlah extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
SQLiteDatabase db = StaticDatabase.openDatabase(this, "assets/foobar.db");
// Do normal database stuff with 'db'...
}
}
你得到一个标准SQLiteDatabase对象,唯一的限制是它不支持写入。 (显然!)
请注意,这将失败,除非数据库存储在您的.apk没有压缩。使用aapt -0
命令添加SQLite数据库或修改build.xml
到<nocompress extension="db" />
标志传递给<aapt>
标签...
在http://bitbucket.org/kiwidrew/android-staticdb获取代码。
注意:我已经完全写完了,而且迄今为止只做了非常基本的测试。错误报告将不胜感激!
没有任何简单的方法直接从资产中读取数据库。您应该在首次运行时将数据库从资产复制到数据文件夹,然后每次启动应用程序时,都应该检查数据文件夹中的数据库,并在数据库不存在时再次复制数据库。
这些步骤可以帮助你:
1)你的数据库上执行这些命令,如果android_metadata
表不存在于数据库中,机器人无法打开您的数据库:
CREATE TABLE android_metadata(locale TEXT DEFAULT 'en_US')
INSERT INTO android_metadata VALUES('en_US')
2)组块您的数据库,因为android不支持从资产中读取超过1 MB大小的文件。
这条巨蟒大块代码数据库:
def chunk_file(file_name):
input_file = open(file_name, "rb")
chunk_counter = 0;
while True:
chunk = input_file.read(512 * 1024) # 512 KB
if chunk:
output_file_name = file_name + "." + str(chunk_counter).zfill(4)
output_file = open(output_file_name, "wb")
output_file.write(chunk)
output_file.close()
chunk_counter += 1
else:
break
input_file.close()
return
# Input: database.db
# Output: database.db.0000, database.db.0001, database.db.0002, ...
chunk_file("database.db")
然后把database.db.0000,database.db.0001,database.db.0002,...在资产的文件夹。
3)应用程序启动时,数据文件夹中存在检查数据库。
public static boolean databaseExists() {
boolean result = false;
SQLiteDatabase checkDB = null;
try {
checkDB = SQLiteDatabase.openDatabase(
getApplicationContext().getFilesDir().getPath() + "/database.db",
null, SQLiteDatabase.OPEN_READONLY);
result = true;
} catch (SQLiteException exception) {
result = false;
}
if (checkDB != null) {
checkDB.close();
}
return result;
}
4)如果数据库中不存在数据库,则将数据库从资产复制到数据文件夹中。
public static void copyDatabase() throws IOException {
AssetManager assets = getApplicationContext().getAssets();
// database.db.0000, database.db.0001, database.db.0002, ... --> databaseChunks.
String[] databaseChunks = assets.list("");
Arrays.sort(databaseChunks);
OutputStream databaseStream = new FileOutputStream(
getApplicationContext().getFilesDir().getPath() + "/database.db");
for (int i = 0; i < databaseChunks.length; i++) {
String databaseChunkName = databaseChunks[i];
InputStream chunkStream = assets.open(databaseChunkName);
int length;
byte[] buffer = new byte[1024];
while ((length = chunkStream.read(buffer)) > 0) {
databaseStream.write(buffer, 0, length);
}
chunkStream.close();
}
databaseStream.close();
return;
}
5)您可以连接到现在的数据库:
SQLiteDatabase database = SQLiteDatabase.openDatabase(
getApplicationContext().getFilesDir().getPath() + "/database.db",
null, SQLiteDatabase.OPEN_READONLY);
// ...
database.close();
- 1. 如何在android mobile中添加.apk和sqlite数据库文件?
- 2. 如何将图像文件上传到现有数据库?
- 3. Flex:在.apk文件中打包数据库文件?
- 4. 如何在数据库中实现文件夹,子文件夹
- 5. 有没有办法将文本文件放入数据库(SQLite)?
- 6. 在.apk安装期间将现有文件放入data \ data \ app_name \ files
- 7. 如何把MySQL数据库放在项目文件夹中
- 8. 如何将现有的数据库文件加载到Python sqlite3中的内存?
- 9. 将数据放置在codeigniter中的数据库中的xml文件中?
- 10. 将数据库文件放置在Visual Studio中的位置
- 11. 将二进制数据文件包含到APK文件中
- 12. 如何在PHP中将文本文件加载到数据库?
- 13. 如何将文件放入可以使用apk的res文件夹中?
- 14. 如何将文件中的数据放入javascript数组中
- 15. 如何将标题和数据放在Tar文件格式中?
- 16. 如何将“文本”放入数据库中?
- 17. 如何获取现有sql 2005/2008数据库的dbschema文件?
- 18. 如何从现有的ActiveRecord.cs文件获取数据库模式?
- 19. 如何在apk中放置java属性文件?
- 20. 如何将新数据添加到Firebase数据库中的现有数据?
- 21. 如何在现有数据库中实现多态关联
- 22. 如何切换现有数据源的数据库上下文?
- 23. 在现有的Android项目中更新数据库文件
- 24. 如何将两个数据库放入一个数据库?
- 25. Android:将数据库添加到apk
- 26. 将SQL文件导入到现有的数据库表(phpmyadmin)
- 27. 如何将数据从Django中的现有JSON文件存储到SQLite数据库中?
- 28. 数据如何在数据库的数据文件中组织
- 29. 如何将H2Database数据库文件转换为MySQL数据库.sql文件?
- 30. 将数据添加到MySQL数据库中的现有数据
好文章,是有益的 – schwiz 2010-10-26 12:41:32