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.aiwalls.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();
    }
   
   
   
}

摘自 qq1761310972

發佈留言