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
{
            //创建目录www.2cto.com
            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();
    }
   
   
   
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值