初学者在学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
1
2
3
4
|
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类型容易转换成其他数据类型)
1
2
3
4
5
6
7
8
9
|
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语句写的正确恰当(这里的正确看工程需求)。
1
2
3
4
5
6
7
8
|
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
1
2
3
4
5
|
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可以用以下方式代替:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
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
而且使用起来非常简单。
这三个函数的操作可以参考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.
本文转自lilin9105 51CTO博客,原文链接:http://blog.51cto.com/7071976/1232364,如需转载请自行联系原作者