天天看点

android 导入外部数据库

常用的数据库操作中,大部分都是在应用内部创建数据库,有时候可能需要访问已经创建完成的数据库,这时就需要导入外部的数据库。

创建数据库实现方法:

1. extends  SQLiteOpenHelper

2. SQLiteDatabase.openOrCreateDatabase

导入外部数据库实现

1.网上广为流传的将 db放在 res目录下面,然后引用ID获取输入流,将数据库写入SD卡或手机内存。这样导入的数据库大小可能出现和原来大小不一致的问题,因为res目录下所有资源打包为APK时系统会进行压缩。

2. 将db放在assets目录下面,通过AssetManager获取输出流,将db写入。由于assets目录下面有些格式的文件大小不能超过2M,所以将数据库改为 *.mp3。在写入SD卡或手机内存时,在将后缀名改为db.由于assets目录下面的文件不会被压缩,所以不会出现导入的数据库大小不一致情况。

有人尝试将数据库写入data/data/应用/目录下面,这样在模拟器下测试木有问题,可以查看到创建成功的数据库。但在手机上,这个目录不能进行任何操作,提示为文件只读,也就是木有权限修改或创建文件。

木有测试过root后的手机是否可以写入。

实现:

public class DBManager

{

private final int BUFFER_SIZE = 1024; 

private SQLiteDatabase database;

private Context context;

public DBManager(Context context)

{

this.context = context; 

}

public SQLiteDatabase openDatabase() 

        File sdFile = Environment.getExternalStorageDirectory();

        File gpsPath = new File(sdFile.getPath()+"/pms/gps.db");

        if (!gpsPath.exists())

        { 

            try

{

            //创建目录

            File pmsPaht = new File(sdFile.getPath()+"/pms");

            Log.i("pmsPaht", "pmsPaht: "+pmsPaht.getPath());

            pmsPaht.mkdirs();

            AssetManager am = this.context.getAssets(); 

InputStream is= am.open("gps.mp3");

FileOutputStream fos = new FileOutputStream(gpsPath);

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(gpsPath, null);

        return database;

    }

public void close()

{

if (database != null)

{

this.database.close(); 

}

}

}

测试 :

public class TestWriteDBActivity extends Activity 

{

    @Override

    public void onCreate(Bundle savedInstanceState) 

    {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        Button create = (Button) findViewById(R.id.create);

        create.setOnClickListener(new View.OnClickListener()

        { 

        @Override

        public void onClick(View v)

        {

        createDB(); 

        }

        });

        Button query = (Button) findViewById(R.id.query);

        query.setOnClickListener(new View.OnClickListener()

@Override

public void onClick(View v)

{

query(); 

}

});

    }

    public void createDB()

    {

    DBManager dbm = new DBManager(this);

    dbm.openDatabase(); 

    dbm.close();

    }

    public void query()

    {

    String sql = "select * from gps limit 5";

    DBManager dbm = new DBManager(this);

    SQLiteDatabase db = dbm.openDatabase(); 

    Cursor cur =  db.rawQuery(sql, null);

    while (cur.moveToNext())

    {

    float latitude = cur.getFloat(1);

    Log.i("latitude", "维度:"+latitude); 

    }

    cur.close();

    db.close();

    }

}