android 导入数据库
2016-01-29 22:11
525 查看
当我们软件中要使用大量数据,我们会选择将这些数据存储到一个数据库中,然后通过数据库的查询修改操作来管理这些数据。大多数情况下我们都只在程序中建立使用数据库,但也有我们在程序中只是使用的数据库,并不在程序中建立它们,因为这种数据库往往数据量比较大,我们在建立时如果不采用多线程和后台服务的话,很容易导致前台界面的阻塞停滞,这样往往会影响用户体验,造成不好的使用效果。这时我们可不可以直接建好数据库并录入数据,然后通过程序将数据库正确导入进我们的软件文件夹里面。这样减少了读取数据和建立数据库的时间,可以在很大程度上提高软件响应的速度。
还是结合之前做的一个软件的天气预报功能开发的实例来讲解如何导入外部数据库。首先我们通过DDMS看一下数据库的存放路径,一般情况下数据库的存放路径为:/data/packagname/databases/(
packagname指的是我们所建立的工程的包名,例如这里我的包名就是com.liuproject.reminder。有的数据库就直接在packagname下面,有的则是在databases目录下,大家可以打开DDMS看一下。)如图databases文件夹下面有两个数据库:
其中City就是我们即将要从外部导入的数据库。我们将建好的City数据库文件拷贝到我们所建工程的assets文件夹中,如下图所示:
要注意我们所提供的外部数据要和我们设计的将在软件中使用的数据库保持一致,及时每一条记录的属性值名称和数据类型一致。数据准备完成后我们就可以开始导入外部数据库了。具体实现源码如下:
public class DBManager {
private final int BUFFER_SIZE = 400000;
/**
* 需要导入数据库的名字
*/
private static final String DB_NAME = "Chinacity";
private static final String PACKAGE_NAME = "com.example.weatherforecast";
private static final String DB_PATH = "/data" +
Environment.getDataDirectory().getAbsolutePath()+"/"+PACKAGE_NAME+"/databases";
private Context context;
private SQLiteDatabase dataBase;
public DBManager(Context context) {
this.context = context;
}
public void openDatabase(){
this.dataBase = this.openDatabase(DB_PATH + "/" + DB_NAME) ;
}
private SQLiteDatabase openDatabase(String dbfile){
//判断数据库文件是否存在,若不存在则执行导入,否者直接打开数据库。
// if(!new File(dbfile).exists()){
try {
InputStream is = this.context.getResources().getAssets().open("Chinacity");
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.close();//关闭输出流
is.close();//关闭输入流
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile, null);
return db;
}catch (FileNotFoundException e) {
Log.e("Database", "File not found");
e.printStackTrace();
}catch (IOException e) {
Log.e("Database", "IO exception");
e.printStackTrace();
}
// }
return null;
}
通过上面的这个class我们就可以将存放在assets文件夹中的外部数据库导入到我们所需要的文件目录下。接着开始建立我们在程序中所要使用的数据库类,如下代码:
class
CityDB extends
SQLiteOpenHelper{//城市Id数据库操作
public
CityDB(Context context,String name,CursorFactory factory,int
version) {
super(context,
name,factory, version);
}
@Override
public
void
onCreate(SQLiteDatabase db) {
}
@Override
public
void
onUpgrade(SQLiteDatabase db, int
oldVersion, int
newVersion) {
}
}
在之后的程序中我们就可以通过new
CityDB(this, NAME, null,
VERSION);来创建一个数据库操作辅助对象,其中的NAME要与我们之间导入的外部数据库名称一致,在我的例子里面NAME=“City”,VERSION为数据库的版本号,尽量保持与前面建立时的一致性。在程序合适的位置使用ImportDB类的copyDatabase()方法将数据库导入。如果数据库比较大可以在后台开线程进行操作。
在导入外部数据库之前,先去创建数据库。
DBManager dbHelper = new DBManager();
dbHelper.openDatabase();
可以在自己定义的SQLightOpenHelper里面写一些操作数据库的方法。
还是结合之前做的一个软件的天气预报功能开发的实例来讲解如何导入外部数据库。首先我们通过DDMS看一下数据库的存放路径,一般情况下数据库的存放路径为:/data/packagname/databases/(
packagname指的是我们所建立的工程的包名,例如这里我的包名就是com.liuproject.reminder。有的数据库就直接在packagname下面,有的则是在databases目录下,大家可以打开DDMS看一下。)如图databases文件夹下面有两个数据库:
其中City就是我们即将要从外部导入的数据库。我们将建好的City数据库文件拷贝到我们所建工程的assets文件夹中,如下图所示:
要注意我们所提供的外部数据要和我们设计的将在软件中使用的数据库保持一致,及时每一条记录的属性值名称和数据类型一致。数据准备完成后我们就可以开始导入外部数据库了。具体实现源码如下:
public class DBManager {
private final int BUFFER_SIZE = 400000;
/**
* 需要导入数据库的名字
*/
private static final String DB_NAME = "Chinacity";
private static final String PACKAGE_NAME = "com.example.weatherforecast";
private static final String DB_PATH = "/data" +
Environment.getDataDirectory().getAbsolutePath()+"/"+PACKAGE_NAME+"/databases";
private Context context;
private SQLiteDatabase dataBase;
public DBManager(Context context) {
this.context = context;
}
public void openDatabase(){
this.dataBase = this.openDatabase(DB_PATH + "/" + DB_NAME) ;
}
private SQLiteDatabase openDatabase(String dbfile){
//判断数据库文件是否存在,若不存在则执行导入,否者直接打开数据库。
// if(!new File(dbfile).exists()){
try {
InputStream is = this.context.getResources().getAssets().open("Chinacity");
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.close();//关闭输出流
is.close();//关闭输入流
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile, null);
return db;
}catch (FileNotFoundException e) {
Log.e("Database", "File not found");
e.printStackTrace();
}catch (IOException e) {
Log.e("Database", "IO exception");
e.printStackTrace();
}
// }
return null;
}
通过上面的这个class我们就可以将存放在assets文件夹中的外部数据库导入到我们所需要的文件目录下。接着开始建立我们在程序中所要使用的数据库类,如下代码:
class
CityDB extends
SQLiteOpenHelper{//城市Id数据库操作
public
CityDB(Context context,String name,CursorFactory factory,int
version) {
super(context,
name,factory, version);
}
@Override
public
void
onCreate(SQLiteDatabase db) {
}
@Override
public
void
onUpgrade(SQLiteDatabase db, int
oldVersion, int
newVersion) {
}
}
在之后的程序中我们就可以通过new
CityDB(this, NAME, null,
VERSION);来创建一个数据库操作辅助对象,其中的NAME要与我们之间导入的外部数据库名称一致,在我的例子里面NAME=“City”,VERSION为数据库的版本号,尽量保持与前面建立时的一致性。在程序合适的位置使用ImportDB类的copyDatabase()方法将数据库导入。如果数据库比较大可以在后台开线程进行操作。
在导入外部数据库之前,先去创建数据库。
DBManager dbHelper = new DBManager();
dbHelper.openDatabase();
可以在自己定义的SQLightOpenHelper里面写一些操作数据库的方法。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件