在花费数小时试图解决这个问题之前,也许我可以利用某人的专业知识;是否可以在(Web)服务器上生成SQLite数据库并将其下载到Android设备然后使用它?
我需要同步数据,但完全创建数据库并将其作为二进制文件发送可能要快得多。
答案 0 :(得分:8)
这是我的实施:
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;
}
这会将数据库下载到您的应用程序专用存储see here
不要忘记您需要在清单中使用互联网权限。
然后从这个文件中获取一个实际的数据库,你可以这样做:
/**
* 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();
}
答案 1 :(得分:3)
当我尝试使用它下载文件时,您接受的解决方案似乎需要很长时间。我在这里找到了一个更好的解决方案(带进度指示器):
http://www.hassanpur.com/blog/2011/04/android-development-downloading-a-file-from-the-web/
它包括源代码和分步教程。
答案 2 :(得分:1)
这个网站对我帮助很大! http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/
它教授的内容是如何创建一个在Android中使用的数据库(以及随后的任何怪癖),它还向您展示了如何将该代码复制到应用程序内部数据库存储位置。
从那里了解如何修改它以便下载SQLLite
应该不会太难。