Android 如何导入已有的外部数据库

转载自:http://www.cnblogs.com/xiaowenji/archive/2011/01/03/1925014.html

我们平时见到的android数据库操作一般都是在程序开始时创建一个空的数据库,然后再进行相关操作。如果我们需要使用一个已有数据的数据库怎么办呢?
我们都知道android系统下数据库应该存放在 /data/data/com.*.*(package name)/ 目录下,所以我们需要做的是把已有的数据库传入那个目录下。操作方法是用FileInputStream读取原数据库,再用FileOutputStream把读取到的东西写入到那个目录。
操作方法:1. 把原数据库包括在项目源码的 res/raw 目录下,然后建立一个DBManager类,代码如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

package com.android.ImportDatabase;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.os.Environment;

import android.util.Log;

public class DBManager {

    private final int BUFFER_SIZE = 400000;

    public static final String DB_NAME = "countries.db"; //保存的数据库文件名

    public static final String PACKAGE_NAME = "com.android.ImportDatabase";

    public static final String DB_PATH = "/data"

            + Environment.getDataDirectory().getAbsolutePath() + "/"

            + PACKAGE_NAME;  //在手机里存放数据库的位置

    private SQLiteDatabase database;

    private Context context;

    DBManager(Context context) {

        this.context = context;

    }

    public void openDatabase() {

        this.database = this.openDatabase(DB_PATH + "/" + DB_NAME);

    }

    private SQLiteDatabase openDatabase(String dbfile) {

        try {

            if (!(new File(dbfile).exists())) {  //判断数据库文件是否存在,若不存在则执行导入,否则直接打开数据库

                InputStream is = this.context.getResources().openRawResource(

                        R.raw.countries); //欲导入的数据库

                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;

    }


1

//do something else here<br>


1

2

3

4

    public void closeDatabase() {

        this.database.close();

    }

}

然后在程序的首个Activity中示例化一个DBManager对象,然后对其执行openDatabase方法就可以完成导入了,可以把一些要对数据库进行的操作写在DBManager类里,然后通过DBManager类的对象调用;也可以在完成导入之后通过一个SQliteDatabase类的对象打开数据库,并执行操作。

我的做法是 在程序的首个Activity中导入数据库:


1

2

3

4

5

6

7

8

9

package com.android.ImportDatabase;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

public class RootView extends Activity {

    public DBManager dbHelper;


1

2

3

4

5

6

7

8

9

10

11

12

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        dbHelper = new DBManager(this);

        dbHelper.openDatabase();

        dbHelper.closeDatabase();

    }

}

此时在DDMS中可以查看到,外部数据库已经成功导入

在需要使用数据库的类里:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

package com.android.ImportDatabase;

import java.util.ArrayList;

import android.app.Activity;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import android.os.Bundle;

public class TaxiActivity extends Activity {

    private SQLiteDatabase database;

        ArrayList<CityClass> CITY;

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        

        database = SQLiteDatabase.openOrCreateDatabase(DBManager.DB_PATH + "/" + DBManager.DB_NAME, null);

        CITY = getCity();

        

        // do something with CITY

        database.close();

    }

    private ArrayList<CityClass> getCity() {

        

        Cursor cur = database.rawQuery("SELECT city.id_city, city.name FROM taxi, city WHERE city.id_city = taxi.id_city GROUP BY city.id_city", null);

        

        if (cur != null) {

            int NUM_CITY = cur.getCount();

            ArrayList<CityClass> taxicity = new ArrayList<CityClass>(NUM_CITY);

            if (cur.moveToFirst()) {

                do {

                    String name = cur.getString(cur.getColumnIndex("name"));

                    int id = cur.getInt(cur.getColumnIndex("id_city"));

                    CityClass city = new CityClass("", 0);

                    System.out.println(name);  //额外添加一句,把select到的信息输出到Logcat

                    city.city_name = name;

                    city.city_id = id;

                    taxicity.add(city);

                } while (cur.moveToNext());

            }

            return taxicity;

        } else {

            return null;

        }

    }

}

查看输出的结果:

如果导入的数据库大小有问题,或使用InputStream读取出错了,请看此贴 [iPhone/Android] 导入程序的数据库大小与原数据库大小不一致怎么办?

时间: 2024-10-11 07:21:00

Android 如何导入已有的外部数据库的相关文章

Java代码实现向Oracle数据库中导入已备份的数据库文件

今天将很早就实现的一个Oracle数据库备份功能粘贴出来,这个功能是在大学做阶段设计时写的: import java.io.IOException; /** * Java代码实现向Oracle数据库中导入已备份的数据库文件 * * @author:Gaohuanjie */ public class OracleImportDatabase { /** * 向Oracle数据库中导入已备份的数据库文件 * * @author:Gaohuanjie * @param userName 进入数据库所

android笔记--导入已有工程

导入单个工程: 在Package Explorer中空白地方右键-New-Java Project.. 把Use default location的勾去掉,点击右边的Browse.. 找到刚下载的或者是你存在的要导入的工程的位置,选择确定 导入多个工程: Import... Andriod--Existing Android Code Into Workspace 选择工程目录,我的目录下面存在5个工程,至少要选择一个工程,未导入过的显示为黑色,我的五个工程已经导入过,所以显示灰色

Android导入外部数据库

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

[已解决]C#批量高效率导入大数据到数据库[百万级以上]

将几百万条数据导入到数据库中,怎么样高效率的导入?下面我就介绍一个高效率的方法:1.将数据库文件(DB.csv)导入到DataTable中: /// <summary> /// 将CSV文件的数据读取到DataTable中 /// </summary> /// <param name="fileName">CSV文件路径</param> /// <returns>返回读取了CSV数据的DataTable</returns

Android Studio 导入外部lib文件

Android Studio 导入外部lib文件 1.将jar包放入Module里的lib文件夹中.(自己创建lib文件夹) 2.在project选中jar包点击右键"Add as library". 3.此时项目仍然是无法正常编译的,这时需要在项目里的module的build.gradle文件里的dependencies节加入以下内容 compile files('lib/xxxx.jar') 这里files括号里面的地址是相对于build.gradle文件的相对路径 4.此时项目正

android中activity可以响应外部的action的例子(可以用这个来导入外部文件)

如果我们在文件浏览器中点击一个文件,然后点击它,会弹出一个列表给你选择 如果使自己的应用也出现在这个列表上,必须在menifest的这个activity下加入: <activity android:name="com.example.clickabletextview.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name

Android手机通讯录项目开发--联系人数据库contacts2.db介绍

项目描述:该项目为基于Android平台的手机通讯录,主要模块分为四个部分:联系人管理模块,通话记录管理模块,短信管理模块,系统设置模块. 系统结构图如下: 本项目启动时间:2014年5月28日 说明:本次开发项目的所有源码全部会分享给大家.开发此项目的目的有这几点:一.锻炼独立开发项目的能力,二.增加对Android开发的了解,三.熟悉Android通讯录机制. 闲话不多说,正式开始! 技术要点一:熟悉Android联系人数据库contacts2.db 1.获得联系人数据库contacts2.

读取本地已有的.db数据库

先在项目中导入已有的xxx.db 下面新建DBManager .java和SQLiteActivity.java package android.sqlite; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import android.content.Context; import android.data

如何用 Android Studio 导入开源项目以及常见错误的解决办法

声明:这篇文章完全来自这篇文章,感谢大神的相助.这篇文章纯粹是为了备份. 本篇以Github上最热门的MaterialDesign库,MaterialDesignLibrary来介绍怎样使用Android Sudio导入开源项目的,如果你和我一样刚刚从Eclipse转到AS,那本篇文章非常适合你. 如果不引入任何第三方库,不做自动化分渠道打包等操作,那可以在完全不了解Gradle的情况下进行Android项目的开发.但如果要想导入Github上的热门项目,必须首先熟悉Gradle. 1. Gra