làm việc với database trên android

18
- Strings.xml <? xml version = "1.0" encoding = "utf-8" ?> <resources> <string name="app_name">Android Demo Read XML</string> <string name="parsed_data">http://android.vn\nHướng dẫn bởi thanhlong90.it </string> <string name="tkmoi">Tạo tài khoản mới</string> <string name="danh_sach">Danh sách tk</string> </resources> activity_main.xml <? xml version = "1.0" encoding = "UTF-8" ?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="14dp" android:gravity="center" android:text="@string/parsed_data" android:textAppearance="?android:attr/textAppearanceMedium" android:textStyle="bold" /> <Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/tkmoi" /> <Button android:id="@+id/button2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/danh_sach" /> <TextView android:id="@+id/textView2" android:layout_width="match_parent" android:layout_height="wrap_content" />

Upload: technetvn

Post on 24-Nov-2015

67 views

Category:

Documents


4 download

TRANSCRIPT

- Strings.xml

AndroidDemoReadXMLhttp://android.vn\nHngdnbithanhlong90.itTotikhonmiDanhschtk

activity_main.xml

- MyDatabase.java

packageandroid.vn;importandroid.content.ContentValues;importandroid.content.Context;importandroid.database.Cursor;importandroid.database.SQLException;importandroid.database.sqlite.SQLiteDatabase;importandroid.database.sqlite.SQLiteOpenHelper;publicclassMyDatabase{/*Tndatabase*/privatestaticfinalStringDATABASE_NAME="DB_USER";/*Versiondatabase*/privatestaticfinalintDATABASE_VERSION=1;/*Tntabelvcccolumntrongdatabase*/privatestaticfinalStringTABLE_ACCOUNT="ACCOUNT";publicstaticfinalStringCOLUMN_ID="_id";publicstaticfinalStringCOLUMN_ACC="tentaikhoan";publicstaticfinalStringCOLUMN_PASSWORD="matkhau";publicstaticfinalStringCOLUMN_NAME="hoten";/*Ccitngkhc*/privatestaticContextcontext;staticSQLiteDatabasedb;privateOpenHelperopenHelper;/*Hmdng,khitoitng*/publicMyDatabase(Contextc){MyDatabase.context=c;}/*Hmmktnitidatabase*/publicMyDatabaseopen()throwsSQLException{openHelper=newOpenHelper(context);db=openHelper.getWritableDatabase();returnthis;}/*Hmngktnividatabase*/publicvoidclose(){openHelper.close();}/*HmcreateDatadngchndmidliuvodatabase*/publiclongcreateData(StringtenDN,StringmatKhau){ContentValuescv=newContentValues();cv.put(COLUMN_ACC,tenDN);cv.put(COLUMN_PASSWORD,matKhau);cv.put(COLUMN_NAME,"nodata");returndb.insert(TABLE_ACCOUNT,null,cv);}/*HmgetDatatrvtonbdliucatableACCOUNTcadatabasedi1chui*/publicStringgetData(){String[]columns=newString[]{COLUMN_ID,COLUMN_ACC,COLUMN_PASSWORD,COLUMN_NAME};Cursorc=db.query(TABLE_ACCOUNT,columns,null,null,null,null,null);/*if(c==null)Log.v("Cursor","CisNULL");*/Stringresult="";//getColumnIndex(COLUMN_ID);llychs,vtrcactCOLUMN_ID...intiRow=c.getColumnIndex(COLUMN_ID);intiN=c.getColumnIndex(COLUMN_ACC);intiMK=c.getColumnIndex(COLUMN_PASSWORD);intiHoTen=c.getColumnIndex(COLUMN_NAME);//Vnglplydliucacontrfor(c.moveToFirst();!c.isAfterLast();c.moveToNext()){result=result+""+c.getString(iRow)+"-id:"+c.getString(iN)+"-pw:"+c.getString(iMK)+"-ten:"+c.getString(iHoTen)+"\n";}c.close();//Log.v("Result",result);returnresult;}//----------------classOpenHelper------------------privatestaticclassOpenHelperextendsSQLiteOpenHelper{/*Hmdngkhito1OpenHelper*/publicOpenHelper(Contextcontext){super(context,DATABASE_NAME,null,DATABASE_VERSION);}/*Tomidatabase*/@OverridepublicvoidonCreate(SQLiteDatabasearg0){arg0.execSQL("CREATETABLE"+TABLE_ACCOUNT+"("+COLUMN_ID+"INTEGERPRIMARYKEYAUTOINCREMENT,"+COLUMN_ACC+"TEXTNOTNULL,"+COLUMN_PASSWORD+"TEXTNOTNULL,"+COLUMN_NAME+"TEXTNOTNULL);");}/*Kimtraphinbndatabasenukhcsthayi*/@OverridepublicvoidonUpgrade(SQLiteDatabasearg0,intarg1,intarg2){arg0.execSQL("DROPTABLEIFEXISTS"+TABLE_ACCOUNT);onCreate(arg0);}}}

- MainActivity.java

packageandroid.vn;importandroid.os.Bundle;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.TextView;importandroid.app.Activity;publicclassMainActivityextendsActivity{privateButtondangKyTK,hienThi;privateTextViewdanhSachTK;privateMyDatabasedatabase=newMyDatabase(this);privateinti=0;@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);dangKyTK=(Button)findViewById(R.id.button1);hienThi=(Button)findViewById(R.id.button2);danhSachTK=(TextView)findViewById(R.id.textView2);dangKyTK.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){database.open();database.createData("taikhoanthu"+i,"111");i++;database.close();}});hienThi.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){database.open();Stringds=database.getData();database.close();danhSachTK.setText(ds);}});}}

Lm vic vi Database trn Android (P1)Cch lu tr d liu trn Android bao gm 3 cch:+ S dng Shared Preferences+ S dng file+ S dng SQLiteVi Shared Preferences (L lu d liu di dng mt cp kha - d liu di dng file xml, rt tin cho vic lu tr cu hnh ca ng dng) v lu d liu di dng File th n gin nn mnh khng cp y.Kin thc v SQLite mnh cng khng nhc n na, v mnh c bi ni v vn ny trc y ri.Kinh nghim ca mnh lm vic vi SQLite l:+ To mt lp qun l chung vi mt s tc v:-To database-Chy cu SQL-To table....+ To mt lp th hin mt trng trong database bi SQLite ch h tr 3 loi d liu nn vic ny cng rt n gin.+ To mt lp th hin cho mt dng (row) d liu+ To mt lp cho th hin mt table.Sau y chng ta s i ln lt tng cng vic trn

u tin ta s i t vic to mt lp qun l chung vic to database c th bn c th xem VD hiu vic nypackage com.tannm.doan.taskmanager.database;

import java.util.Vector;import com.tannm.doan.taskmanager.R;import android.content.*;import android.database.sqlite.*;import android.database.*;

public class Database {// typespublic enum Result {Success, errUnknown, errCantInsertNewData, errCantUpdateData, errCantCreateTable, errNoDbAccess, errCantGetDataFromTable, errCantFindData, errCantGetData, errCantDeleteData, errTableNotExists, errCantSetValuesForDataRow, errCantGetValuesFromDataRow,};

// fieldspublic static final String sTableNameAppointments = "Appointments";public static final String sTableNameTasks = "Tasks";public static final String sTableNameNotes = "Notes";public static final String sTableNameAlarms = "Alarms";public static final String sTableNameEvent = "Event";

// fieldsprivate final String dbName = "TaskManagerDatabase.db";private Context ctx = null;private SQLiteDatabase db = null;private Result resultDbTablesCreated = Result.errUnknown;

// methodspublic Database(Context context) {ctx = context;open();createTables();}

public final String getName() {return dbName;}

public static int getErrDesc(Result result) {int msgId = R.string.errUnknown;if (result == Result.errCantInsertNewData)msgId = R.string.errCantInsertNewData;if (result == Result.errCantUpdateData)msgId = R.string.errCantUpdateData;if (result == Result.errCantCreateTable)msgId = R.string.errCantCreateTable;if (result == Result.errNoDbAccess)msgId = R.string.errNoDbAccess;if (result == Result.errCantGetDataFromTable)msgId = R.string.errCantGetDataFromTable;if (result == Result.errCantFindData)msgId = R.string.errCantFindData;if (result == Result.errCantGetData)msgId = R.string.errCantGetData;if (result == Result.errCantDeleteData)msgId = R.string.errCantDeleteData;if (result == Result.errTableNotExists)msgId = R.string.errTableNotExists;if (result == Result.errCantSetValuesForDataRow)msgId = R.string.errCantSetValuesForDataRow;if (result == Result.errCantGetValuesFromDataRow)msgId = R.string.errCantGetValuesFromDataRow;return msgId;}

public boolean open() {boolean bSuccess = false;// open / create databasedb = ctx.openOrCreateDatabase(dbName, Context.MODE_PRIVATE, null);// test resultif (isOpened()) {bSuccess = true;} else {db = null;}return bSuccess;}

public void close() {if (isOpened())db.close();}

public boolean isOpened() {if (db != null)return true;return false;}

public SQLiteDatabase getSQLiteDb() {return db;}

public boolean delete() {close();return ctx.deleteDatabase(dbName);}

public boolean execSQL(String sql) {boolean bSuccess = false;try {if (isOpened())db.execSQL(sql);bSuccess = true;} catch (SQLException e) {}return bSuccess;}

public boolean tableExists(String sTableName) {boolean bResult = false;if (isOpened()) {String sql = "select name from sqlite_master where type = 'table' and name = '%s'";sql = String.format(sql, sTableName);Cursor cr = db.rawQuery(sql, null);if (cr.getCount() > 0)bResult = true;cr.close();}return bResult;}

private void createTables() {resultDbTablesCreated = Database.Result.errUnknown;if (isOpened()) {Vector vecDataRows = new Vector();vecDataRows.add(new DataRowAppointment(this));vecDataRows.add(new DataRowTask(this));vecDataRows.add(new DataRowNote(this));vecDataRows.add(new DataRowAlarm(this));

for (int i = 0; i < vecDataRows.size(); i++) {DataTable dataTable = new DataTable(vecDataRows.get(i));if (dataTable.createTable()) {resultDbTablesCreated = Database.Result.Success;} else {resultDbTablesCreated = Database.Result.errCantCreateTable;break;}}} else {resultDbTablesCreated = Database.Result.errNoDbAccess;}}

public boolean tablesCreated() {return resultDbTablesCreated == Result.Success;}

public synchronized boolean databaseReady() {return (isOpened() && tablesCreated());}

public Result tablesCreationResult() {return resultDbTablesCreated;}}

Ln trc mnh cp n vic to mt lp qun l chung vi mt s tc v:- To database- Chy cu SQL- To table- ....Ln ny mnh xin gii thiu to mt th hin ca mt trng trong Database SQLiteTrong SQLite ch c 3 kiu d liu l: INT, TEXT, BOOLV th ta cn to mt bin enum cha mt b cc hng s v kiu d liu ny. Sau implement mt s phng thc nh trong VD sau

package com.tannm.doan.taskmanager.database;

import java.util.Calendar;import android.content.*;

public class DataField { // types public static enum Type { INT, TEXT, BOOL };

// fields private Calendar dateOut = Calendar.getInstance();

// fields private DataRow dataRow = null; private ContentValues values = null;

// fields private int index = 0; private String sName = ""; private Type fieldType = Type.INT; private boolean bCanBeNull = true; private boolean bPrimaryKey = false;

// methods public DataField(int index, String sName, Type fieldType, boolean bCanBeNull, boolean bPrimaryKey) { this.index = index; this.sName = sName; this.fieldType = fieldType; this.bCanBeNull = bCanBeNull; this.bPrimaryKey = bPrimaryKey; }

public String getColumnDefinition() { String s = sName + " " + getSqlType(fieldType); if (bPrimaryKey) s += " PRIMARY KEY"; if (!bCanBeNull) s += " NOT NULL"; return s; }

public Type getType() { return fieldType; }

public int getIndex() { return index; }

public String getSqlType(Type value) { switch (value) { case INT: return "INTEGER"; case TEXT: return "TEXT"; case BOOL: return "INTEGER"; } return "TEXT"; }

public void setParentRow(DataRow dataRow) { this.dataRow = dataRow; this.values = this.dataRow.getContentValues(); }

public String getName() { return sName; }

// getters public String asString() { return values.getAsString(sName); }

public long asLong() { return values.getAsLong(sName); }

public boolean asBoolean() { return (values.getAsLong(sName) == 1); }

public boolean isNull() { return (values.get(sName) == null); }

public Calendar asCalendar() { dateOut.setTimeInMillis(values.getAsLong(sName)); return dateOut; }

// setters public void set(String value) { values.put(sName, value); }

public void set(long value) { values.put(sName, value); }

public void set(boolean value) { int i = (value) ? 1 : 0; values.put(sName, i); }

public void set(Calendar value) { values.put(sName, value.getTimeInMillis()); }

public void setNull() { values.put(sName, (String) null); }}

Lm vic vi Database trn Android (P3)Tip tc ti s ch cc bn to mt th hin ca mt dng d liu.Mi mt bng trong SQLite nn to mt th hin k tha t lp DataRow ny.Mt DataRow cha mt s cc DataField nn ta khai bo mt mng DataField.Ngoi ra ta cn phi khai bo mt bin trung ContentValues v mt th hin Database ta to phn 1package com.tannm.doan.taskmanager.database;

import android.content.ContentValues;import android.database.Cursor;

public abstract class DataRow { // fields protected Database userdb = null; private DataField[] vecTableDef = null; private ContentValues values = new ContentValues();

// methods public DataRow(Database userdb) { this.userdb = userdb; }

public Database getUserDb() { return userdb; }

public void setTableDefinition(DataField[] vecTableDef) { this.vecTableDef = vecTableDef; // initialize field parent updateDataFieldsParentRow(this); }

public void updateDataFieldsParentRow(DataRow row) { for (int i = 0; i < vecTableDef.length; i++) vecTableDef[i].setParentRow(row); }

public void copyTableDefinition(DataRow data) { setTableDefinition(data.vecTableDef); }

public DataField[] getTableDef() { return vecTableDef; }

public boolean validate() { return false; }

public void clearContentValues() { values.clear(); }

public ContentValues getContentValues() { return values; }

public void setContentValues(ContentValues values) { this.values = values; updateDataFieldsParentRow(this); }

public boolean copyContentValues(ContentValues values) { this.values = values; updateDataFieldsParentRow(this); try { getValuesFromDataRow(); return true; } catch (Exception e) { } return false; }

public DataField value(int idx) { return vecTableDef[idx]; }

public String fieldName(int idx) { return vecTableDef[idx].getName(); }

public boolean getValuesFromCursor(Cursor cr) { if ((cr != null) && (cr.getPosition() != -1)) { for (int idx = 0; idx < vecTableDef.length; idx++) { DataField field = value(idx); // check if null value if (cr.isNull(idx)) { field.setNull(); } else { final DataField.Type t = field.getType(); // parse value by type if (t == DataField.Type.INT) field.set(cr.getLong(idx)); if (t == DataField.Type.TEXT) field.set(cr.getString(idx)); if (t == DataField.Type.BOOL) field.set((cr.getInt(idx) == 1) ? true : false); } } return true; } return false; }

// sets fields values data (ContentValues values contener) from parent // object fields public abstract void setValuesForDataRow();

// gets data from fields values (ContentValues values contener) to parent // object fields public abstract void getValuesFromDataRow();

public abstract String getTableName();

}

Ngoi ra ta cn c mt lp khai bo mt s cc phng thc utility d dng lm vic vi Database. Bn hy xem v d thy c th cc phng thc ny.

package com.tannm.doan.taskmanager.database;

import android.database.Cursor;

public class DataTable { // fields private DataRow dataRow = null;

// methods public DataTable(DataRow dataRow) { this.dataRow = dataRow; }

public Database getUserDb() { return dataRow.getUserDb(); }

public String getTableName() { return dataRow.getTableName(); }

public DataRow getDataRow() { return dataRow; }

public boolean createTable() { if (getUserDb().tableExists(getTableName())) { return true; } else { return getUserDb() .execSQL( getSqlTableDefinition(getTableName(), dataRow .getTableDef())); } }

public String getSqlTableDefinition(String sTableName, DataField[] vecTableDef) { String def = "CREATE TABLE " + sTableName + " ("; for (int i = 0; i < vecTableDef.length; i++) { def += vecTableDef[i].getColumnDefinition(); if (i < (vecTableDef.length - 1)) def += ", "; } def += ")"; return def; }

public long insertValues() { long lRowId = getUserDb().getSQLiteDb().insert(getTableName(), null, dataRow.getContentValues()); return lRowId; }

public long updateValues(long lRowId) { String sWhere = String.format("_ID = %d", lRowId); long lRowsUpdated = getUserDb().getSQLiteDb().update(getTableName(), dataRow.getContentValues(), sWhere, null); return lRowsUpdated; }

public long deleteDataRow(long lRowId) { String sWhere = String.format("_ID = %d", lRowId); long lRowsUpdated = getUserDb().getSQLiteDb().delete(getTableName(), sWhere, null); return lRowsUpdated; }

public Cursor locateDataRow(long lRowId) { final String s = "select * from %s where _ID = %d"; String sql = String.format(s, getTableName(), lRowId); Cursor cr = getUserDb().getSQLiteDb().rawQuery(sql, null); // if cursor valid, set first data row as current if ((cr != null) && (cr.getCount() > 0)) cr.moveToFirst(); return cr; }

public Cursor locateAlarmDataRow(int iType, long lRefID) { final String s = "select * from %s where Type = %d and RefID = %d"; String sql = String.format(s, getTableName(), iType, lRefID); Cursor cr = getUserDb().getSQLiteDb().rawQuery(sql, null); // if cursor valid, set first data row as current if ((cr != null) && (cr.getCount() > 0)) cr.moveToFirst(); return cr; }

public Database.Result updateData(boolean bInsertMode, long lEditRowId) { Database.Result result = Database.Result.errUnknown; if (getUserDb().isOpened()) { try { dataRow.setValuesForDataRow(); } catch (Exception e) { return Database.Result.errCantSetValuesForDataRow; } // select update mode if (bInsertMode) { // insert new data row long lRowId = insertValues(); if (lRowId > 0) { result = Database.Result.Success; } else { result = Database.Result.errCantInsertNewData; } } else { // update existing data row long lRowsUpdated = updateValues(lEditRowId); if (lRowsUpdated == 1) { result = Database.Result.Success; } else { result = Database.Result.errCantUpdateData; } } } else { result = Database.Result.errNoDbAccess; } return result; }

public Database.Result deleteData(long iRowId) { Database.Result result = Database.Result.errUnknown; if (getUserDb().isOpened()) { if (getUserDb().tableExists(getTableName())) { long lRowsDeleted = deleteDataRow(iRowId); if (lRowsDeleted == 1) { result = Database.Result.Success; } else { result = Database.Result.errCantDeleteData; } } else { result = Database.Result.errTableNotExists; } } else { result = Database.Result.errNoDbAccess; } return result; }

public Database.Result getRowDataForEdit(long lRowId) { Database.Result result = Database.Result.errUnknown; // get requested data row Cursor cr = locateDataRow(lRowId); if (cr == null) { result = Database.Result.errCantGetData; } else { if (cr.getCount() > 0) { if (dataRow.getValuesFromCursor(cr)) { try { dataRow.getValuesFromDataRow(); } catch (Exception e) { return Database.Result.errCantGetValuesFromDataRow; } result = Database.Result.Success; } else { result = Database.Result.errCantGetDataFromTable; } cr.close(); } else { result = Database.Result.errCantFindData; } } return result; }}

Trn y l ton b kinh nghim lm vic vi Database m ti hc c trong qu trnh lm vic thc t. Mong gip nhng ngi mi lm vic vi SQLite trn Android. Chc cc bn thnh cng