» 首頁 » 討論區 » Android程式設計 »關於手機上的sqlite資料庫

關於手機上的sqlite資料庫

發表人: 訪客
發表時間: 2011-08-25 15:50:56
想請問各位前輩,我在網路上找到的關於資料庫操作的範例都是在程式執行後新建一個資料庫來存取
假如我今天想要讓我的程式建立的apk檔內含一個資料庫,並且裡面已經有資料可以讓程式存取,請問這個資料庫應該要如何跟程式綁在一起發佈?
發表人: Seachaos
積分: 2432
發表時間: 2011-08-25 23:52:12
以這SQLite初始的語法為例

[sea:javaCode]
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL(DB_CREATE_TABLE);
initData();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
db.execSQL("DROP TABLE IF EXISTS `"+DB_NAME+"`");
onCreate(db);
}
[/sea]

可以看到這樣寫的話 不管是資料庫的更新或是新增都會執行initData();
所以就可以把資料初始化的地方寫在initData();

這部份我的做法是自已寫個轉換器
把csv或是文字檔放在Android的assets,然後用read file的方式把資料插入到SQLite內

有問題歡迎一起研究
發表人: 訪客
發表時間: 2011-08-26 07:43:50
那麼,如果我想更新這些資料的話,也是從assets讀出來做修改再存回去就好了?
發表人: Seachaos
積分: 2432
發表時間: 2011-08-26 16:51:43
是的
如果是更新的話就是在onUpgrade的地方處理
不過要注意舊資料的問題
發表人: 訪客
發表時間: 2011-09-01 21:59:26
請問initData()的這個方法是要把資料做轉換嗎?
發表人: Seachaos
積分: 2432
發表時間: 2011-09-02 01:52:32
對,其實這是個自定函數
用來對資料做初化的
其實你也可以用別的名稱

主要是初始化的資料要自已實做
發表人: 訪客
發表時間: 2011-10-11 21:54:06
請問除了這個方法,還有其他方法嗎?
發表人: Seachaos
積分: 2432
發表時間: 2011-10-11 22:00:19
我後來有發現,SQLite資料庫還有
SQLiteDatabase.openDatabase
這個方法,他可以開起外部的SQLite
可以試看看
發表人: 訪客
發表時間: 2011-10-12 22:10:32
請問這個方法是寫main的程式裡嗎?還是資料庫的程式裡?
發表人: 訪客
發表時間: 2011-10-12 22:30:03
你好,我有嘗試把.db檔放在res裡的資料夾
但在手機上執行還是找不到資料庫
不知道有沒有辦法解決?
發表人: Seachaos
積分: 2432
發表時間: 2011-10-13 02:06:28
您好:
Android的Raw是無法寫入的
所以解決辦法是從Raw中取出,放到記憶卡中做讀寫

取出Raw file的方法是

[sea:javaCode]
InputStream ins = getResources().openRawResource(R.raw.my_db);
[/sea]

他是一個InputStream,所以再用OutputStream寫到記憶卡就可以了
發表人: 訪客
發表時間: 2011-10-16 15:19:21
你好,請問OutputStream的部分該怎麼寫呢?
謝謝回答!!
發表人: 訪客
發表時間: 2011-10-16 16:55:20
順便問一下
如果是自己用一個database命名為"abc.db"
則我直接把這個db放入raw裡後
還要用一個下面這樣的指令嗎?
libDbHp.sCreateTableCommand = "CREATE TABLE " + DB_TABLE + "(" +
"_id INTEGER PRIMARY KEY," +
"callnumber TEXT NOT NULL," +
"name TEXT," +
"code TEXT," +
"line TEXT," +
"column TEXT," +
"row TEXT,);";

還是可以直接呼叫db裡的資料?
發表人: Seachaos
積分: 2432
發表時間: 2011-10-16 17:26:46
Hi, Output檔案的簡單範例如下

[sea:javaCode]
InputStream is= …;
int length;
byte[] buffer = new byte[1024];
FileOutputStream fos = new FileOutputStream("test.db");
while((length = is.read(buffer))!=-1){
fos.write(buffer, 0, length);
}
[/sea]


你把DB放在RAW不就是因為裡面有資料嗎?
所以讀出來的時候就不用Create Table了
除非DB是空的,但那也就沒有放在Raw的意義了,直接建立在記憶卡上就可以了
發表人: 訪客
發表時間: 2011-10-17 22:23:48
你好,要讀取資料是要用getReadableDatabase()嗎?
發表人: Seachaos
積分: 2432
發表時間: 2011-10-18 23:22:36
Hi:
如果你是用SQLiteDatabase開啟的話直接使用query就可以了

如下
[sea:javaCode]
SQLiteDatabase db = ...
Cursor cursor = db.query(tableName, new String[] { "name", "value" },
"`name`=?", new String[] { name }, null, null, "`id` desc");
[/sea]
發表人: 訪客
發表時間: 2011-10-22 23:20:39
你好,程式碼是這樣,但是在手機上執行還是找不到資料,不知道是哪裡出錯呢?

[sea:javaCode]
private SQLiteDatabase openDatabase()
{
try
{
File SDCardpath = Environment.getExternalStorageDirectory();
File myDataPath = new File(SDCardpath.getAbsolutePath()+ PATH);
String databaseFilename = myDataPath + "/" + DB_FILE;

//Log.i("DB","DB_DIR: "+myDataPath);
//Log.i("DB","DB_FILE: "+databaseFilename);
//Log.i("DB","DB_DIR_?: "+ myDataPath.exists());

if(!myDataPath.exists())
{
myDataPath.mkdirs();
}
//Log.i("DB","DB_DIR_After?: "+myDataPath.exists());
//Log.i("DB","DB_FILE_?: "+(new File(databaseFilename)).exists());
if(!(new File(databaseFilename).exists()))
{
InputStream is = getResources().openRawResource(R.raw.library);
FileOutputStream fos = new FileOutputStream(databaseFilename);
byte[]buffer = new byte[8192];
int count = 0;
while((count = is.read(buffer))>0)
{
fos.write(buffer,0,count);
}
fos.close();
is.close();
}
//Log.i("DB","DB_FILE_After?: "+(new File(databaseFilename)).exists());
SQLiteDatabase database = SQLiteDatabase.openDatabase(databaseFilename,null,RESULT_OK);
return database;
}
catch(Exception e)
{
//Log.i("DB","DB_DIR_Exception: ");
}
return null;
}
[/sea]
發表人: Seachaos
積分: 2432
發表時間: 2011-10-23 22:34:38
您好:
我想是openDatabase的Flag用錯了
試看看下面的Flag
[sea:javaCode]
SQLiteDatabase.openDatabase(DB_Path, null, SQLiteDatabase.OPEN_READWRITE);
[/sea]
發表人: 訪客
發表時間: 2011-10-24 22:06:19
你好,若是資料庫裡有ABC三個資料表
那呼叫特定的資料表(例:A)時,要怎麼呼叫呢?
發表人: Seachaos
積分: 2432
發表時間: 2011-10-25 13:11:12
這邊就是看你的Table Name了

[sea:javaCode]
db.query(tableName …
[/sea]
表A的話tableName就是A
B.C亦同