Android导入外部数据库

简介:

当我们软件中要使用大量数据,我们会选择将这些数据存储到一个数据库中,然后通过数据库的查询修改操作来管理这些数据。大多数情况下我们都只在程序中建立使用数据库,但也有我们在程序中只是使用的数据库,并不在程序中建立它们,因为这种数据库往往数据量比较大,我们在建立时如果不采用多线程和后台服务的话,很容易导致前台界面的阻塞停滞,这样往往会影响用户体验,造成不好的使用效果。这时我们可不可以直接建好数据库并录入数据,然后通过程序将数据库正确导入进我们的软件文件夹里面。这样减少了读取数据和建立数据库的时间,可以在很大程度上提高软件响应的速度。

还是结合之前做的一个软件的天气预报功能开发的实例来讲解如何导入外部数据库。首先我们通过DDMS看一下数据库的存放路径,一般情况下数据库的存放路径为:/data/packagname/databases/( packagname指的是我们所建立的工程的包名,例如这里我的包名就是com.liuproject.reminder。有的数据库就直接在packagname下面,有的则是在databases目录下,大家可以打开DDMS看一下。)如图databases文件夹下面有两个数据库:

其中City(上图为导入成功后的截图)就是我们即将要从外部导入的数据库。我们将建好的City数据库文件拷贝到我们所建工程的assets文件夹中,如下图所示:

要注意我们所提供的外部数据要和我们设计的将在软件中使用的数据库保持一致,及时每一条记录的属性值名称和数据类型一致。数据准备完成后我们就可以开始导入外部数据库了。具体实现源码如下:

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Environment;
 
public class ImportDB{
    private final int BUFFER_SIZE = 10000;
    public static final String DB_NAME = "City"; //保存的数据库文件名
    public static final String PACKAGE_NAME = "com.liuproject.reminder";//工程包名
    public static final String DB_PATH = "/data"
            + Environment.getDataDirectory().getAbsolutePath() + "/"
            + PACKAGE_NAME+"/databases";  //在手机里存放数据库的位置
private Context context;
 
   ImportDB(Context context) {
        this.context = context;
    }
   
    public void copyDatabase() {
             String dbfile=DB_PATH + "/" + DB_NAME ;
        try {
           //执行数据库导入
                InputStream is = this.context.getResources().getAssets().open("City"); //欲导入的数据库
                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();//关闭输入流
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } 
    }
}
通过上面的这个class我们就可以将存放在assets文件夹中的外部数据库导入到我们所需要的文件目录下。接着开始建立我们在程序中所要使用的数据库类,如下代码:
class CityDB extends SQLiteOpenHelper{//城市Id数据库操作
         private final String DB_NAME="CityID";//数据库名称
          public CityDB(Context context,String name,CursorFactory factory,int version) {
                   super(context, name,factory, version);
          }
 
         @Override
         public void onCreate(SQLiteDatabase db) {             
                    String createDB= "create table "+DB_NAME+"(cityid varchar(14) primary key , cityname varchar(20),type int)";//数据库中记录的属性名称及属性值类型
                    db.execSQL(createDB);//创建数据库
         }
 
         @Override
         public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                     String dropTableSQL = "DROP TABLE IF EXISTS "  + DB_NAME + " ";
                     db.execSQL(dropTableSQL);
                     dropTableSQL = "DROP TABLE IF EXISTS " + DB_NAME   + " ";
                     db.execSQL(dropTableSQL);
                     onCreate(db);     
         }
          
         public void execSQL(String sql, Object[] args) {//执行操作
                   SQLiteDatabase db = this.getWritableDatabase();
                   db.execSQL(sql, args);
         }
 
         public Cursor query(String sql, String[] args) {//返回操作结果指针
                   SQLiteDatabase db = this.getWritableDatabase();
                   Cursor cursor = db.rawQuery(sql, args);
                   return cursor;
         }
}

    在之后的程序中我们就可以通过 new CityDB(this, NAME, null,  VERSION); 来创建一个数据库操作辅助对象,其中的 NAME 要与我们之间导入的外部数据库名称一致,在我的例子里面 NAME= City ”, VERSION 为数据库的版本号,尽量保持与前面建立时的一致性。在程序合适的位置使用 ImportDB 类的 copyDatabase() 方法将数据库导入。如果数据库比较大可以在后台开线程进行操作。
目录
相关文章
|
8月前
|
数据库 Android开发 数据库管理
Android 使用Room操作数据库进行数据库版本的升级和迁移
Android 使用Room操作数据库进行数据库版本的升级和迁移
427 0
|
SQL 存储 Oracle
【Android】7.0复杂数据的存储SQLite(内置数据库)Room框架
常用的数据库 sqlserver oracle mysql Android嵌入式数据库SQLite SQLite数据库支持SQL语法和ACID事务,适用于存储大量的关系型数据 eg:qq的聊天列表 学习强国的新闻
514 0
|
数据库 Android开发 数据库管理
android 数据库简单理解使用
android 数据库简单理解使用
404 0
android 数据库简单理解使用
|
数据库 Android开发
Android中SQLlite数据库的增删改查
Android中SQLlite数据库的增删改查
181 0
|
API 数据库 Android开发
Android--数据库GreenDao使用
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/80228390 一、简介 greenDAO是一个对象关系映射(ORM)的框架,能够提供一个接口通过操作对象的方式去操作关系型数据库,它能够让你操作数据库时更简单、更方便。
1320 0
|
Shell 数据库 Android开发
|
SQL 数据库 Android开发