android: 怎么把外部已有的数据库导入到已创建sqlite数据到手机sdcard中?

tianke0711 2014-10-20 10:15:46
跪求大家, android: 怎么把外部已有的数据库导入到到手机sdcad?
比如我把数据库文件放到asset或者res文件下。怎么导入到sdcard上面啊(比如创建sqlite数据库到sdcard上面)。请求源代码或者指教!
...全文
2147 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZXY_Big_Rain 2016-01-12
  • 打赏
  • 举报
回复
您好,我是把db文件放在了res的raw 下了已经把他复制到虚拟机的sd卡里了。可是里面的表和数据却没有被复制过去,而且还新建了一张_matadata的表。跪求大神提供源码指教 啊!
jk_meng 2015-12-22
  • 打赏
  • 举报
回复
您好,我也遇到相同的问题了,怎么解决呀?本来看到后面觉得可以看到很想看到的解答了,谁知道你最后来一句“很简单”就结帖了。。想哭呀
Fr_2014 2015-12-20
  • 打赏
  • 举报
回复
你好,我也遇到这样的问题,可否告诉我解决方法?
tianke0711 2014-10-21
  • 打赏
  • 举报
回复
问题 很简单!搞定了。谢谢大家的回帖啊,感谢各位指点。我有时请求一些大侠帮忙解决此问题。好像很忙,没时间搭理,想要做更好的论坛,从细节做起。我开始攻克下一个数据库问题,我是一个开发菜鸟。 等我忙完这段时间后。过段时间会分享源代码和开发经验(特别是一些小的细节,对初学者来说存在问题)给大家,希望更多的人受益。
文明游戏 2014-10-20
  • 打赏
  • 举报
回复
你是把数据库文件拷贝到哪里的是手机自带内存里面吗?如:data/data/包名/databases/,你那个报的错误是不能打开数据库文件啊,你的读取的位置不对吧
tianke0711 2014-10-20
  • 打赏
  • 举报
回复
报错信息如下:
tianke0711 2014-10-20
  • 打赏
  • 举报
回复
引用 1 楼 chenshi011 的回复:
外部数据库是SQLite的吧,可以把这个数据库文件放到asset文件夹下面,然后读取asset放到sd卡下面
下面这个代码可以用
/**
* 从Apk本地Assets复制文件到指定文件夹
*
* @param context
* @param filepath
* @param fileName
* @return
*/
public static boolean copyFileFromAssets(Context context, String filepath,
String fileName) {
boolean result = false;
try {
// 检查 SQLite 数据库文件是否存在
if ((new File(filepath + fileName)).exists() == false) {
// 如 SQLite 数据库文件不存在,再检查一下 database 目录是否存在
File f = new File(filepath);
// 如 database 目录不存在,新建该目录
if (!f.exists()) {
f.mkdir();
}
try {
// 得到 assets 目录下我们实现准备好的 SQLite 数据库作为输入流
InputStream is = context.getAssets().open(fileName);
// 输出流
OutputStream os = new FileOutputStream(filepath + fileName);
// 文件写入
byte[] buffer = new byte[1024];
int length;
while ((length = is.read(buffer)) > 0) {
os.write(buffer, 0, length);
}
// 关闭文件流
os.flush();
os.close();
is.close();
result = true;
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
// TODO: handle exception
}
return result;
}

还记得加上读写sd卡的权限



非常感谢您! 我通过您的代码 写入了。但是我想查询里面的数据,locat结果说,没有我想查询的表格,我不知道什么原因,麻烦你解答一下:
代码如下:
public class DBManager {
private Context context;
public final String DB_PATH2 = android.os.Environment.getExternalStorageDirectory().getAbsolutePath()+"/tianke";
private final String DB_NAME = "MyDatabase.db";
private SQLiteDatabase database;
private final int BUFFER_SIZE = 1024;
DBManager(Context context) {
this.context = context;
}

// public void openDatabase() {
// this.database = this.openDatabase(DB_PATH2 + "/" + DB_NAME);
// System.out.println("DB_PATH2:"+ DB_PATH2);
// }

public SQLiteDatabase openDatabase() {
File dbFile = new File(DB_PATH2+"/MyDatabase.db");


if(!dbFile.exists()){
//InputStream is = this.context.getResources().openRawResource(R.raw.);
try {
//创建目录
File pmsPaht = new File(DB_PATH2);
Log.i("pmsPaht", "pmsPaht: "+pmsPaht.getPath());
pmsPaht.mkdirs();
AssetManager am = this.context.getAssets();
InputStream is = am.open(DB_NAME);
FileOutputStream fos = new FileOutputStream(dbFile);
byte[] buffer = new byte[BUFFER_SIZE];
int count = 0;
while ((count = is.read(buffer)) > 0) {
fos.write(buffer, 0, count);
}
fos.flush();
fos.close();
is.close();
am.close();
}catch (IOException e) {
e.printStackTrace();
}
}
database = SQLiteDatabase.openOrCreateDatabase(dbFile, null);
return database;
}
//http://jalhaskazakhlike.lofter.com/post/3f320a_15df9b3
//http://www.cnblogs.com/xiaowenji/archive/2011/01/03/1925014.html
public void closeDatabase() {
if (database!=null){
this.database.close();
}
}

}
public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button create = (Button) findViewById(R.id.button1);
Button query = (Button) findViewById(R.id.button2);
create.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {

createDB();
}
});
query.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
queryDB();

}
});
}
public void createDB()
{
DBManager dbm = new DBManager(this);
dbm.openDatabase();
dbm.closeDatabase();
}
public void queryDB()
{
String sql = "select * from Employees";

DBManager dbm = new DBManager(this);
SQLiteDatabase db = dbm.openDatabase();
Cursor cur = db.rawQuery(sql, null);

while (cur.moveToNext())
{
//String id = cur.getColumnName(1);
//float la = cur.ge;
//float id = cur.getColumnName(1);
int id = cur.getInt(1);
Log.i("latitude", "id:"+id);
}
cur.close();
db.close();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

}
数据库只有一个表格:
tianke0711 2014-10-20
  • 打赏
  • 举报
回复
引用 楼主 tianke0711 的回复:
跪求大家, android: 怎么把外部已有的数据库导入到到手机sdcad?
比如我把数据库文件放到asset或者res文件下。怎么导入到sdcard上面啊(比如创建sqlite数据库到sdcard上面)。请求源代码或者指教!


非常感谢您! 我通过您的代码 写入了。但是我想查询里面的数据,locat结果说,没有我想查询的表格,我不知道什么原因,麻烦你解答一下:
代码如下:
public class DBManager {
private Context context;
public final String DB_PATH2 = android.os.Environment.getExternalStorageDirectory().getAbsolutePath()+"/tianke";
private final String DB_NAME = "MyDatabase.db";
private SQLiteDatabase database;
private final int BUFFER_SIZE = 1024;
DBManager(Context context) {
this.context = context;
}

// public void openDatabase() {
// this.database = this.openDatabase(DB_PATH2 + "/" + DB_NAME);
// System.out.println("DB_PATH2:"+ DB_PATH2);
// }

public SQLiteDatabase openDatabase() {
File dbFile = new File(DB_PATH2+"/MyDatabase.db");


if(!dbFile.exists()){
//InputStream is = this.context.getResources().openRawResource(R.raw.);
try {
//创建目录
File pmsPaht = new File(DB_PATH2);
Log.i("pmsPaht", "pmsPaht: "+pmsPaht.getPath());
pmsPaht.mkdirs();
AssetManager am = this.context.getAssets();
InputStream is = am.open(DB_NAME);
FileOutputStream fos = new FileOutputStream(dbFile);
byte[] buffer = new byte[BUFFER_SIZE];
int count = 0;
while ((count = is.read(buffer)) > 0) {
fos.write(buffer, 0, count);
}
fos.flush();
fos.close();
is.close();
am.close();
}catch (IOException e) {
e.printStackTrace();
}
}
database = SQLiteDatabase.openOrCreateDatabase(dbFile, null);
return database;
}
//http://jalhaskazakhlike.lofter.com/post/3f320a_15df9b3
//http://www.cnblogs.com/xiaowenji/archive/2011/01/03/1925014.html
public void closeDatabase() {
if (database!=null){
this.database.close();
}
}

}
public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button create = (Button) findViewById(R.id.button1);
Button query = (Button) findViewById(R.id.button2);
create.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {

createDB();
}
});
query.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
queryDB();

}
});
}
public void createDB()
{
DBManager dbm = new DBManager(this);
dbm.openDatabase();
dbm.closeDatabase();
}
public void queryDB()
{
String sql = "select * from Employees";

DBManager dbm = new DBManager(this);
SQLiteDatabase db = dbm.openDatabase();
Cursor cur = db.rawQuery(sql, null);

while (cur.moveToNext())
{
//String id = cur.getColumnName(1);
//float la = cur.ge;
//float id = cur.getColumnName(1);
int id = cur.getInt(1);
Log.i("latitude", "id:"+id);
}
cur.close();
db.close();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

}
数据库只有一个表格:


哎,真难 2014-10-20
  • 打赏
  • 举报
回复
楼上已经写出了具体方法。放到sdcard卡后再打开就行了
Hare_ 2014-10-20
  • 打赏
  • 举报
回复
楼上正解!就是通过IO流复制到sdcard上面指定的目录里
文明游戏 2014-10-20
  • 打赏
  • 举报
回复
外部数据库是SQLite的吧,可以把这个数据库文件放到asset文件夹下面,然后读取asset放到sd卡下面 下面这个代码可以用
/**
	 * 从Apk本地Assets复制文件到指定文件夹
	 * 
	 * @param context
	 * @param filepath
	 * @param fileName
	 * @return
	 */
	public static boolean copyFileFromAssets(Context context, String filepath,
			String fileName) {
		boolean result = false;
		try {
			// 检查 SQLite 数据库文件是否存在
			if ((new File(filepath + fileName)).exists() == false) {
				// 如 SQLite 数据库文件不存在,再检查一下 database 目录是否存在
				File f = new File(filepath);
				// 如 database 目录不存在,新建该目录
				if (!f.exists()) {
					f.mkdir();
				}
				try {
					// 得到 assets 目录下我们实现准备好的 SQLite 数据库作为输入流
					InputStream is = context.getAssets().open(fileName);
					// 输出流
					OutputStream os = new FileOutputStream(filepath + fileName);
					// 文件写入
					byte[] buffer = new byte[1024];
					int length;
					while ((length = is.read(buffer)) > 0) {
						os.write(buffer, 0, length);
					}
					// 关闭文件流
					os.flush();
					os.close();
					is.close();
					result = true;
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		return result;
	}
还记得加上读写sd卡的权限
tianke0711 2014-10-20
  • 打赏
  • 举报
回复
引用 12 楼 heaimnmn 的回复:
其实很简单的逻辑,你首先放到raw里面,然后运行程序,看sdcard里面没有,然后再通过openhelper去调用sdcard地址的db,如果说db里面没有表,你就需要打卡sdcard里面的db,看看表表有没有
谢谢版主啊!能不能给点code提示一下,或者你可以下载一下我的code,看看什么问题,替我修改一下,我这是第一次接触andorid Sqlite。实在是麻烦你了!我的源代码文件可以在下面链接下载: 我的整个文件源代码可以从这个链接下载: http://download.csdn.net/detail/tianke0711/8058783
哎,真难 2014-10-20
  • 打赏
  • 举报
回复
其实很简单的逻辑,你首先放到raw里面,然后运行程序,看sdcard里面没有,然后再通过openhelper去调用sdcard地址的db,如果说db里面没有表,你就需要打卡sdcard里面的db,看看表表有没有
tianke0711 2014-10-20
  • 打赏
  • 举报
回复
引用 3 楼 heaimnmn 的回复:
楼上已经写出了具体方法。放到sdcard卡后再打开就行了
版主 你好,麻烦你解答一下我的问题可以吗?
tianke0711 2014-10-20
  • 打赏
  • 举报
回复
引用 7 楼 chenshi011 的回复:
你是把数据库文件拷贝到哪里的是手机自带内存里面吗?如:data/data/包名/databases/,你那个报的错误是不能打开数据库文件啊,你的读取的位置不对吧
我是把数据库放到手机中sdcard中。出现了无法读取问题,但是数据库已经写进去了啊。
tianke0711 2014-10-20
  • 打赏
  • 举报
回复
引用 8 楼 pengguohua1988 的回复:
你最好先压缩再转移然后解压
能不能详细告知或者通过email交流?谢谢了啊!
MR__P 2014-10-20
  • 打赏
  • 举报
回复
你最好先压缩再转移然后解压

80,337

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧