標籤:android sqlite
本文的執行個體是基於《Android系統回顧(八):網路通訊(一)》中的項目添加而來的。
實現的效果是:在PostActivity裡,當美女們載入完成之後,把她們的資訊非同步地寫入資料庫中。
/MeiNvLiuLanQi/src/com/example/meinvliulanqi/basic_service/IDBOperate.java檔案:
package com.example.meinvliulanqi.basic_service;
import android.database.sqlite.SQLiteDatabase;
public interface IDBOperate
{
public boolean doOperate(SQLiteDatabase db);
public void onDBOpreaterFinished(Boolean result);
}
/MeiNvLiuLanQi/src/com/example/meinvliulanqi/basic_service/MeinvDbHelper.java檔案:
package com.example.meinvliulanqi.basic_service;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class MeinvDbHelper extends SQLiteOpenHelper
{
// 資料庫的基本參數
public static final String DB_NAME = "meinvDB.db";
// --------------------------------------------------------------
// 資料表的基本描述,表名和表中的列名
public static final String DB_TABLE_MEINV_INFO = "tab_meinv_info";
public static final String KEY_ID = "id";
public static final String KEY_HEAD_PATH = "head_path";
public static final String KEY_NAME = "name";
public static final String KEY_BIRTHDAY = "birthday";
public static final String KEY_ADDRESS = "address";
public static final String KEY_STATURE = "stature";
public static final String KEY_WEIGHT = "weight";
public static final String KEY_BUST = "bust";
public static final String KEY_WAISTLINE = "waistline";
public static final String KEY_HIP = "hip";
// --------------------------------------------------------------
// 建立資料庫的SQL語句
private static final String DATABASE_CREATE = String.format(
"create table %s (%s integer primary key autoincrement, %s text not null, %s text not null, %s text not null, %s text not null, %s float not null, %s float not null, %s text not null, %s float not null, %s float not null)",
DB_TABLE_MEINV_INFO,
KEY_ID,
KEY_HEAD_PATH,
KEY_NAME,
KEY_BIRTHDAY,
KEY_ADDRESS,
KEY_STATURE,
KEY_WEIGHT,
KEY_BUST,
KEY_WAISTLINE,
KEY_HIP);
// 定義建構函式
public MeinvDbHelper(Context context, int version)
{
// SQLiteOpenHelper(Context context, String name, CursorFactory factory,
// int version)
// 第一個參數:建立資料庫的上下文,比如,如果傳入的是com.example.meinvliulanqi.ui.MainActivity的執行個體,那資料庫檔案在使用者手機中的實際儲存位置將是:/data/data/com.example.meinvliulanqi.ui/databases
// 第二個參數:欲建立的資料庫的名稱,比如名稱是meinvDB.db,那麼在資料庫成功建立完成之後/data/data/com.example.meinvliulanqi.ui/databases路徑下就會有meinvDB.db、meinvDB.db-journal兩個檔案,一個是資料庫檔案,另一個是記錄檔
// 第三、第四個參數:CursorFactory用於產生Cursor對象,version為建立資料庫的版本
super(context, DB_NAME, null, version);
}
// 重寫onCreate函數,當磁碟上不存在資料庫時負責建立新資料庫
@Override
public void onCreate(SQLiteDatabase arg0)
{
arg0.execSQL(DATABASE_CREATE);
}
// 重寫onUpgrade函數,當存在資料庫版本不一致時,升級磁碟上的資料庫到目前的版本,覆蓋安裝後可能會出現這種情況
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2)
{
arg0.execSQL("DROP TABLE IF EXIST " + DB_TABLE_MEINV_INFO);
onCreate(arg0);
}
}
/MeiNvLiuLanQi/src/com/example/meinvliulanqi/basic_service/Task_operate_db.java檔案:
package com.example.meinvliulanqi.basic_service;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.os.AsyncTask;
import android.util.Log;
public class Task_operate_db extends AsyncTask<Void, Integer, Boolean>
{
private Context context;
private int db_version;
private IDBOperate operate;
public Task_operate_db(Context _con, int _ver, IDBOperate _ope)
{
context = _con;
db_version = _ver;
operate = _ope;
}
@Override
protected Boolean doInBackground(Void... para)
{
MeinvDbHelper helper = new MeinvDbHelper(context, db_version);
SQLiteDatabase db = null;
try
{
db = helper.getWritableDatabase();
return operate.doOperate(db);
} catch (Exception e)
{
Log.e("thinking-------", e.getMessage());
return false;
}
}
@Override
protected void onProgressUpdate(Integer... values)
{
}
@Override
protected void onPostExecute(Boolean result)
{
this.operate.onDBOpreaterFinished(result);
}
}
/MeiNvLiuLanQi/src/com/example/meinvliulanqi/ui/PostActivity.java檔案:
package com.example.meinvliulanqi.ui;
import org.json.JSONArray;
import org.json.JSONException;
import com.example.meinvliulanqi.basic_service.IDBOperate;
import com.example.meinvliulanqi.basic_service.IGetdata;
import com.example.meinvliulanqi.basic_service.MeinvDbHelper;
import com.example.meinvliulanqi.basic_service.Task_getimgs;
import com.example.meinvliulanqi.basic_service.Task_operate_db;
import com.example.meinvliulanqi.basic_service.Task_postdata;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.widget.GridView;
public class PostActivity extends Activity implements IGetdata, IDBOperate
{
private MeinvBaseAdapter ada;
private GridView gid_meinv;
private JSONArray meinvs;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_post);
Task_postdata task = new Task_postdata(this);
task.execute(new String[] {
"http://192.168.10.111:8011/MeinvInfo.ashx",
"{\"method\":\"get_meinv\",\"check_num\":1001}" });
}
@Override
public void onGetInfoData(String info)
{
try
{
meinvs = new JSONArray(info);
initUIInfo();
} catch (JSONException e)
{
Log.e("thinking-------", e.getMessage());
}
}
private void initUIInfo()
{
gid_meinv = (GridView) findViewById(R.id.gid_meinv_post);
ada = new MeinvBaseAdapter(meinvs, new Bitmap[meinvs.length()], this);
gid_meinv.setAdapter(ada);
String[][] img_infos = new String[meinvs.length()][2];
for (int i = 0; i < img_infos.length; i++)
{
try
{
img_infos[i][0] = meinvs.getJSONObject(i)
.getString("photoPath");
} catch (JSONException e)
{
img_infos[i][0] = "";
Log.e("thinking-------", e.getMessage());
}
img_infos[i][1] = i + "";
}
Task_getimgs task = new Task_getimgs(this);
task.execute(img_infos);
Task_operate_db task_db = new Task_operate_db(this, 1, this);
task_db.execute();
}
@Override
public void onGetImgData(Bitmap[] img)
{
ada.setImgs(img);
}
@Override
public boolean doOperate(SQLiteDatabase db)
{
try
{
ContentValues newValues = new ContentValues();
for (int i = 0; i < meinvs.length(); i++)
{
newValues.put(MeinvDbHelper.KEY_NAME, meinvs.getJSONObject(i)
.getString("name"));
newValues.put(MeinvDbHelper.KEY_ADDRESS, meinvs
.getJSONObject(i).getString("address"));
newValues.put(MeinvDbHelper.KEY_HEAD_PATH,
"/sdcard/meinvliulanqi/" + i + ".jpg");
newValues.put(MeinvDbHelper.KEY_BUST, meinvs.getJSONObject(i)
.getString("bust"));
newValues.put(MeinvDbHelper.KEY_HIP, meinvs.getJSONObject(i)
.getDouble("hip"));
newValues.put(MeinvDbHelper.KEY_BIRTHDAY,
meinvs.getJSONObject(i).getString("birthday"));
newValues.put(MeinvDbHelper.KEY_STATURE, meinvs
.getJSONObject(i).getDouble("stature"));
newValues.put(MeinvDbHelper.KEY_WEIGHT, meinvs.getJSONObject(i)
.getDouble("weight"));
newValues.put(MeinvDbHelper.KEY_WAISTLINE, meinvs
.getJSONObject(i).getDouble("waistline"));
db.insert(MeinvDbHelper.DB_TABLE_MEINV_INFO, null, newValues);
}
return true;
} catch (Exception e)
{
Log.e("thinking-------", e.getMessage());
return false;
}
}
@Override
public void onDBOpreaterFinished(Boolean result)
{
// TODO Auto-generated method stub
}
}
實現的效果:
當頁面載入完畢之後,adb在/data/data/com.example.meinvliulanqi.ui/databases路徑下可以看到:
把這個meinvDB.db檔案拷出來,用Sqlite3工具查看可以看到:
結果表明資料已經寫入資料庫了。
Android技術——資料庫(三):SQLite資料庫應用執行個體