傻瓜式建立数据库,高效数据库操作代码的编写--android
初学者在学android的时候,看到书上的sqlite数据库编程怎么有点复杂。
初学阶段的难点:
建立数据库表字段(field)数据类型(text,interge)选择较多,考虑较多。
在activity中数据更新插入要考虑的约束条件好多
老是访问数据库的数据,每次都要在activity中声明一个cursor并且通过一大堆代码来获取cursor感觉有点繁琐。
对于上述的难点解决方式如下
1.数据类型都用text(除了id编号)
2.在activity中无论插入或更新都只用DB文件中同一个函数实现,并且不需要在activity中考虑任何因素(是否数据表中已经有当前要插入或更新的数据)
3.在DB文件中 写一个返回值为cursor的函数(返回的cursor为常用的cursor)
要知道的一些原理
1) db.update(TABLE_NAME, cv, where, whereValues)如果更新数据失败返回0
2)db.update(TABLE_NAME, cv, where, whereValues)更新表中符合 where=whereValue的所有值
3)假如要查询的值或要更新的值有多个关键字约束,那么可以安如下填写where 跟where
String where = field1+"=? and " + field2 + "=? and " + field3 + "=?";String[] whereValues = {string1, string2, string3};//Cursor cursor = db.query(HSTRYBUYTABLE, null, where, whereValues, null, null, null);//db.update(HSTRYBUYTABLE, cv, where, whereValues);
4)return db.insert(HSTRYBUYTABLE, null, cv)只要调用就会在数据库中插入数据
方案:
1)构建数据库表时请默认“自动编号”,并且其他字段数据类型都用text,(java中string类型容易转换成其他数据类型)
public void onCreate(SQLiteDatabase db) {String sql = "create table "+YOUTABLENAME+" ("+TABLE_ID+" integer primary key autoincrement, "+TABLE_FIELD1+" text, "+TABLE_FIELD2+" text, "+TABLE_FIELD3+" text, "+TABLE_FIELD4+" text )";db.execSQL(sql);}
2) 在HelpDB中写个如下函数替代insrtDB 跟 updataDB,以后在其他地方直接拿来用就是了,别想那么多,直接能用这个函数关键是update函数中的where语句写的正确恰当(这里的正确看工程需求)。
public int operateHProduct(String string1, String string2, Product string3){int i = 0;if(updateHProduct(string1, string2, string3) == 0 ){//尝试更新数据i = 1;insertHProduct(string1, string2, string3);}return i;}
3) 编写在其他activity中常用的返回值为cursor函数,如:访问整个表的Cursor
public Cursor selectTable(){SQLiteDatabase db = this.getReadableDatabase();Cursor cursor = db.query(TABLE_NAME, null, null, null, null, null, null);return cursor;}
完整例子,仔细看updateProduct的where约束,updateProduct的的where可以用以下方式代替:
package com.sqlitedb;/*展开看接口,模拟数据用户名为lilin* operateHProduct 添加或修改数据* deleteHProduct 删除操作* selectHProducts 获取指向数据库头的cursor,具体操作mainactivity中有,也可参考本文件中的getIDByUadate** */import com.ProjectClass.Product;import com.projectConstant.ProjectConstant;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;public class HistoryDB extends SDSQLiteOpenHelper {private final static String DATABASE_NAME = ProjectConstant.projectDBDirName + ProjectConstant.DB_HISTORY; //数据库名注意加格式名,不然会只建立note_db文件,此处跟sqlitehelper不一样private final static int DATABASE_VERSION = 1; //版本号//product productParent picturename productname price numberprivate final static String HSTRYBUYTABLE= ProjectConstant.DB_HSTRYTABLE;public final static String PRODUCT_ID = "_id";public final static String HISTORY_TYPE = ProjectConstant.DB_HISTORY_TYPE;public final static String PRODUCT_CLIENT = ProjectConstant.DB_CLIENT_ID;public final static String PRODUCT_PARENT = ProjectConstant.DB_PARENT;public final static String PRODUCT_PICTURENAME = ProjectConstant.DB_PICTURENAME;public final static String PRODUCT_PRUDUCTNAME = ProjectConstant.DB_PRODUCTNAME;public final static String PRODUCT_PRICE = ProjectConstant.DB_PRICE;public final static String PRODUCT_NUMBER = ProjectConstant.DB_NUMBER;//构造函数public HistoryDB(Context context) {super(context, DATABASE_NAME, null, DATABASE_VERSION);}//创建数据库@Overridepublic void onCreate(SQLiteDatabase db) {String sql = "create table "+HSTRYBUYTABLE+" ("+PRODUCT_ID+" integer primary key autoincrement, "+PRODUCT_CLIENT+" text, "+HISTORY_TYPE+" text, "+PRODUCT_PARENT+" text, "+PRODUCT_PRUDUCTNAME+" text, "+PRODUCT_PICTURENAME+" text, "+PRODUCT_PRICE+" text, "+PRODUCT_NUMBER+" text )";db.execSQL(sql);}public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {String sql = "drop table if exists "+HSTRYBUYTABLE;db.execSQL(sql);onCreate(db);}//get the first cursorpublic Cursor selectHProducts(){SQLiteDatabase db = this.getReadableDatabase();Cursor cursor = db.query(HSTRYBUYTABLE, null, null, null, null, null, null);return cursor;}public long insertHProduct(String clientName, String type, Product myProduct){SQLiteDatabase db = this.getWritableDatabase();ContentValues cv = new ContentValues();cv.put(PRODUCT_NUMBER, myProduct.getNumber());cv.put(PRODUCT_CLIENT, clientName);cv.put(HISTORY_TYPE, type);cv.put(PRODUCT_PARENT, myProduct.getProductParent());cv.put(PRODUCT_PRICE, myProduct.getPrice());cv.put(PRODUCT_PICTURENAME, myProduct.getPictureName());cv.put(PRODUCT_PRUDUCTNAME, myProduct.getPocductName());return db.insert(HSTRYBUYTABLE, null, cv);}public void deleteHProduct(String clientName, String type, Product myProduct){SQLiteDatabase db = this.getWritableDatabase();String where = PRODUCT_ID+"=?";String[] whereValues = {getIDByUadate(clientName, myProduct.getPocductName(), type)};db.delete(HSTRYBUYTABLE, where, whereValues);}public int operateHProduct(String clientName, String type, Product myProduct){int i = 0;if(updateHProduct(clientName, type, myProduct) == 0 ){i = 1;insertHProduct(clientName, type, myProduct);}return i;}public int updateHProduct(String clientName, String type, Product myProduct){//更改typeSQLiteDatabase db = this.getWritableDatabase();String where = PRODUCT_ID+"=?";//这里的where语句有点复杂可以参考getIDByUadate进行修改String[] whereValues = {getIDByUadate(clientName, myProduct.getPocductName(), type)};ContentValues cv = new ContentValues();cv.put(HISTORY_TYPE, type);cv.put(PRODUCT_NUMBER, myProduct.getNumber());cv.put(PRODUCT_PARENT, myProduct.getProductParent());cv.put(PRODUCT_PRICE, myProduct.getPrice());cv.put(PRODUCT_PICTURENAME, myProduct.getPictureName());return db.update(HSTRYBUYTABLE, cv, where, whereValues);}private String getIDByUadate(String clientName, String ProductName, String type){//得到ID号SQLiteDatabase db = this.getReadableDatabase();String where = PRODUCT_PRUDUCTNAME+"=? and " + PRODUCT_CLIENT + "=? and " + HISTORY_TYPE + "=?";String[] whereValues = {ProductName, clientName, type};Cursor cursor = db.query(HSTRYBUYTABLE, null, where, whereValues, null, null, null);cursor.moveToFirst();if(!cursor.isAfterLast())return cursor.getString(cursor.getColumnIndex(PRODUCT_ID));return "0";}}
这样一个数据库操作的代码中只用三个函数能完成几乎所有工作。
operateHProduct 添加或修改数据//(如果仅仅要更新数据,更新失败不插入数据,那么直接用updataProduct())
deleteHProduct 删除操作
selectHProducts 获取指向数据库头的cursor
而且使用起来非常简单。
这三个函数的操作可以参考http://7071976.blog.51cto.com/blog/7061976/1232365的mainactity,更多可以参考下面的一个dome
关于本例子的数据库怎么写在SD卡上,以下一个dome有涉及。主要是引用的别人写的SDSqliteOpenHelp类(详细见http://7071976.blog.51cto.com/blog/7061976/1232485)
另外附上以前写的ecshop 网店雏形的代码(文中的代码在dome中有)下载地址http://pan.baidu.com/share/link?shareid=1333309535&uk=2065228996,这个代码几乎涉及到30%我所学的东西,里面的代码编写风格,跟内容有一定的价值。下载后先看"说明.txt"。编码utf-8.
更多相关文章
- Android远程数据库通信实现
- Android 页面销毁、重建与数据恢复
- Android NDK开发——操作JNI函数以及复杂对象的传递
- 第五章 以数据为中心—数据存取(1)
- Android 上的 Scala, 实战之路(三)——介个是数据库接口?
- android ui线程和数据的分离
- Android 数据缓存-文件存储
- android 保存Json数据到本地