开发用到数据库,真机运行时想把数据库copy到SD卡中。可是老是不成功,程序也不报错,就是复制不了。求教
数据库存放在res\raw\mobilephone1.db
数据库大小10M。
也设置了权限 允许往SD卡中写数据。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
我这样的读取方式可行吗?
很纠结,一直copy不成功。哎~
求各位指教。在此先谢过了~
private final String DATABASE_PATH = android.os.Environment
.getExternalStorageDirectory().getAbsolutePath()
+ "/mobilephone";
private final String DATABASE_FILENAME = "mobilephone.db";
private SQLiteDatabase openDatabase()
{
try
{
// 获得mobilephone.db文件的绝对路径
String databaseFilename = DATABASE_PATH + "/" + DATABASE_FILENAME;
File dir = new File(DATABASE_PATH);
// 如果/sdcard/mobilephone目录中存在,创建这个目录
if (!dir.exists()) {
dir.mkdir();
}
// 如果在/sdcard/mobilephone目录中不存在
// mobilephone.db文件,则从res\raw目录中复制这个文件到
// SD卡的目录(/sdcard/mobilephone)
if (!(new File(databaseFilename)).exists())
{
// 获得封装mobilephone.db文件的InputStream对象
InputStream is = getResources().openRawResource(R.raw.mobilephone1);
FileOutputStream fos = new FileOutputStream(databaseFilename);
int count = 0;
while (count == 0) {
count = is.available();
}
byte[] buffer = new byte[count];
int readCount = 0; // 已经成功读取的字节的个数
while (readCount < count) {
readCount += is.read(buffer, readCount, count - readCount);
}
fos.write(buffer, 0, count);
fos.close();
is.close();
}
// 打开/sdcard/mobilephone目录中mobilephone.db文件
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(
databaseFilename, null);
return database;
}
catch (Exception e)
{
}
return null;
}
数据库存放在res\raw\mobilephone1.db
数据库大小10M。
也设置了权限 允许往SD卡中写数据。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
我这样的读取方式可行吗?
很纠结,一直copy不成功。哎~
求各位指教。在此先谢过了~
private final String DATABASE_PATH = android.os.Environment
.getExternalStorageDirectory().getAbsolutePath()
+ "/mobilephone";
private final String DATABASE_FILENAME = "mobilephone.db";
private SQLiteDatabase openDatabase()
{
try
{
// 获得mobilephone.db文件的绝对路径
String databaseFilename = DATABASE_PATH + "/" + DATABASE_FILENAME;
File dir = new File(DATABASE_PATH);
// 如果/sdcard/mobilephone目录中存在,创建这个目录
if (!dir.exists()) {
dir.mkdir();
}
// 如果在/sdcard/mobilephone目录中不存在
// mobilephone.db文件,则从res\raw目录中复制这个文件到
// SD卡的目录(/sdcard/mobilephone)
if (!(new File(databaseFilename)).exists())
{
// 获得封装mobilephone.db文件的InputStream对象
InputStream is = getResources().openRawResource(R.raw.mobilephone1);
FileOutputStream fos = new FileOutputStream(databaseFilename);
int count = 0;
while (count == 0) {
count = is.available();
}
byte[] buffer = new byte[count];
int readCount = 0; // 已经成功读取的字节的个数
while (readCount < count) {
readCount += is.read(buffer, readCount, count - readCount);
}
fos.write(buffer, 0, count);
fos.close();
is.close();
}
// 打开/sdcard/mobilephone目录中mobilephone.db文件
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(
databaseFilename, null);
return database;
}
catch (Exception e)
{
}
return null;
}
数据库放在assets目录下
private void copyDataBase() throws IOException
{
// Open your local db as the input stream
InputStream myInput = null;
//获取assets下的资源文件
myInput = myContext.getResources().getAssets().open(DatabaseOperating.DATABASE_NAME);
// Path to the just created empty db
//文件存储到哪里的路径
String outFileName = DatabaseOperating.SD_PATH
+ DatabaseOperating.DB_PATH + DatabaseOperating.DATABASE_NAME;
//首先创建文件夹
String OutPutPath =DatabaseOperating.SD_PATH+DatabaseOperating.DB_PATH;
File OutputFile = new File(OutPutPath);
//输出文件夹不存在,则创建
if (!OutputFile.exists())
{
OutputFile.mkdirs();
}
OutputStream myOutput = null;
try
{
myOutput = new FileOutputStream(outFileName);
}
catch(IOException e)
{
}
//复制文件
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
}
该代码只被执行一次,就是没有找到数据库时。// databases目录是准备放sqlite数据库的地方,也是android程序默认的数据库存储目录
// 数据库名为restaurant.db
String DB_PATH = "/data/data/com.treasure.takeout.ui/databases/";
String DB_NAME="restaurant.db";
// 检查sqlite数据库文件是否存在
if ((new File(DB_PATH + DB_NAME)).exists() == false)
{
// 如sqlite数据库文件不存在,再检查一下databases目录是否存在
File f = new File(DB_PATH);
// 如database目录不存在,新建该目录
if (!f.exists())
{
f.mkdir();
}
try
{
// 得到assets目录下我们实现准备好的sqlite数据库作为输入流
InputStream is = getBaseContext().getAssets().open(DB_NAME);
// 输出流
OutputStream os = new FileOutputStream(DB_PATH + DB_NAME);
// 文件写入
byte[] buffer = new byte[1024];
int length;
while ((length = is.read(buffer)) > 0)
{
os.write(buffer, 0, length);
}
// 关闭文件流
os.flush();
os.close();
is.close();
}
catch (Exception e)
{
}
}注意:当程序被安装到真机上之前,需要将创建好的数据库放在assets目录里。
File sd = Environment.getExternalStorageDirectory();File src = new File(DB_PATH + DATABASE_NAME);File dest = new File(sd + "/" +DATABASE_NAME); try
{
if (Environment.getExternalStorageDirectory().canWrite())
{
if (srcdb.exists())
{
FileChannel src = new FileInputStream(srcdb).getChannel();
FileChannel dst = new FileOutputStream(destdb).getChannel();
dst.transferFrom(src, 0, src.size());
src.close();
dst.close();
flag=0; }
else
{
Toast.makeText(getApplicationContext(), "ERROR: File not found in Database " , Toast.LENGTH_LONG).show();
}
}
else
{
Toast.makeText(getApplicationContext(), "ERROR: Cannot write to file" , Toast.LENGTH_LONG).show();
}
}
catch (Exception e)
{
Log.e("Movedb", "Error in Copying" + e.toString()); }也许你只需要一个许可的权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>