android 傻瓜式编程,傻瓜式创建数据库,高效数据库操做代码的编写--android

初学者在学android的时候,看到书上的sqlite数据库编程怎么有点复杂。java

初学阶段的难点:android

创建数据库表字段(field)数据类型(text,interge)选择较多,考虑较多。sql

在activity中数据更新插入要考虑的约束条件好多数据库

总是访问数据库的数据,每次都要在activity中声明一个cursor而且经过一大堆代码来获取cursor感受有点繁琐。编程

对于上述的难点解决方式以下dom

1.数据类型都用text(除了id编号)ide

2.在activity中不管插入或更新都只用DB文件中同一个函数实现,而且不须要在activity中考虑任何因素(是否数据表中已经有当前要插入或更新的数据)函数

3.在DB文件中写一个返回值为cursor的函数(返回的cursor为经常使用的cursor)this

要知道的一些原理编码

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 number

private 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);

}

//建立数据库

@Override

public 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 cursor

public 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){//更改type

SQLiteDatabase 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

并且使用起来很是简单。

关于本例子的数据库怎么写在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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值