在花费数小时试图解决这个问题之前,也许我可以利用某人的专业知识; 是否有可能在(Web)服务器上生成一个SQLite数据库,然后将其下载到Android设备并使用它?
我需要同步数据,但完全创建数据库并以二进制形式发送可能会更快。
我需要同步数据,但完全创建数据库并以二进制形式发送可能会更快。
这是我的实现:
private static boolean downloadDatabase(Context context) {
try {
// Log.d(TAG, "downloading database");
URL url = new URL("http://some-url.com/db/" + "db_name.s3db");
/* Open a connection to that URL. */
URLConnection ucon = url.openConnection();
/*
* Define InputStreams to read from the URLConnection.
*/
InputStream is = ucon.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
/*
* Read bytes to the Buffer until there is nothing more to read(-1).
*/
ByteArrayBuffer baf = new ByteArrayBuffer(50);
int current = 0;
while ((current = bis.read()) != -1) {
baf.append((byte) current);
}
/* Convert the Bytes read to a String. */
FileOutputStream fos = null;
// Select storage location
fos = context.openFileOutput("db_name.s3db", Context.MODE_PRIVATE);
fos.write(baf.toByteArray());
fos.close();
// Log.d(TAG, "downloaded");
} catch (IOException e) {
Log.e(TAG, "downloadDatabase Error: " , e);
return false;
} catch (NullPointerException e) {
Log.e(TAG, "downloadDatabase Error: " , e);
return false;
} catch (Exception e){
Log.e(TAG, "downloadDatabase Error: " , e);
return false;
}
return true;
}
这将把数据库下载到您应用程序的私有存储中(请看这里)
不要忘记在您的清单文件中添加网络权限。
要从该文件获取实际的数据库,可以执行以下操作:
/**
* Copies your database from your local downloaded database that is copied from the server
* into the just created empty database in the
* system folder, from where it can be accessed and handled.
* This is done by transfering bytestream.
* */
private void copyServerDatabase() {
// by calling this line an empty database will be created into the default system path
// of this app - we will then overwrite this with the database from the server
SQLiteDatabase db = getReadableDatabase();
db.close();
OutputStream os = null;
InputStream is = null;
try {
// Log.d(TAG, "Copying DB from server version into app");
is = mContext.openFileInput("db_name.s3db");
os = new FileOutputStream("/data/data/your.package.name/databases/"); // XXX change this
copyFile(os, is);
} catch (Exception e) {
Log.e(TAG, "Server Database was not found - did it download correctly?", e);
} finally {
try {
//Close the streams
if(os != null){
os.close();
}
if(is != null){
is.close();
}
} catch (IOException e) {
Log.e(TAG, "failed to close databases");
}
}
// Log.d(TAG, "Done Copying DB from server");
}
private void copyFile(OutputStream os, InputStream is) throws IOException {
byte[] buffer = new byte[1024];
int length;
while((length = is.read(buffer))>0){
os.write(buffer, 0, length);
}
os.flush();
}
我尝试使用你提供的解决方案下载文件时,耗费了很长时间。我在这里找到了一个更好的解决方案(带有进度指示器):
http://www.hassanpur.com/blog/2011/04/android-development-downloading-a-file-from-the-web/
它包括源代码和逐步教程。
这个网站帮了我很多!http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/
它主要教你如何在Android中创建数据库(以及相关的注意事项),还会告诉你如何将代码复制到应用程序的内部数据库存储位置。
从那里,修改代码使其适用于下载SQLLite
应该不太困难。
SQLiteOpenHelper
的扩展,参见:https://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#getReadableDatabase() - Blundell