傻瓜式建立数据库,高效数据库操作代码的编写--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

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,如需转载请自行联系原作者

相关文章
|
2月前
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
133 6
|
2月前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
29 1
|
2月前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异:从代码到用户体验
【10月更文挑战第5天】在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。它们在技术架构、开发环境及用户体验上有着根本的不同。本文通过比较这两种平台的开发过程,揭示背后的设计理念和技术选择如何影响最终产品。我们将深入探讨各自平台的代码示例,理解开发者面临的挑战,以及这些差异如何塑造用户的日常体验。
|
2月前
|
SQL 关系型数据库 MySQL
创建SQL数据库的基本步骤与代码指南
在信息时代,数据管理显得尤为重要,其中数据库系统已成为信息技术架构的关键部分。而当我们谈论数据库系统时,SQL(结构化查询语言)无疑是其中最核心的工具之一。本文将详细介绍如何使用SQL创建数据库,包括编写相应的代码和必要的步骤。由于篇幅限制,本文可能无法达到您要求的2000字长度,但会尽量涵盖创建数
72 3
|
2月前
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
169 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
3月前
|
存储 Java Android开发
🔥Android开发大神揭秘:从菜鸟到高手,你的代码为何总是慢人一步?💻
在Android开发中,每位开发者都渴望应用响应迅速、体验流畅。然而,代码执行缓慢却是常见问题。本文将跟随一位大神的脚步,剖析三大典型案例:主线程阻塞导致卡顿、内存泄漏引发性能下降及不合理布局引起的渲染问题,并提供优化方案。通过学习这些技巧,你将能够显著提升应用性能,从新手蜕变为高手。
32 2
|
3月前
|
SQL NoSQL Java
彻底革新你的数据库操作体验!Micronaut数据访问技巧让你瞬间爱上代码编写!
【9月更文挑战第10天】Java开发者们一直在寻找简化应用程序与数据库交互的方法。Micronaut作为一个现代框架,提供了多种工具和特性来提升数据访问效率。本文介绍如何使用Micronaut简化数据库操作,并提供具体示例代码。Micronaut支持JPA/Hibernate、SQL及NoSQL(如MongoDB),简化配置并无缝集成。通过定义带有`@Repository`注解的接口,可以实现Spring Data风格的命名查询。
70 6
|
3月前
|
前端开发 数据库
数据库表设计生成代码
BizWorks ToolKit插件集成Mybatis-Plus代码生成工具,支持从数据库表生成代码,便于研发过程中数据模型变更后的代码同步。本文介绍批量生成代码的方法、配置说明及项目示例。配置文件`*.mp.yaml`用于描述生成行为,可放置于`src/main/resource/bizworks/mybatis-plus/`路径下。配置包括数据库信息、输出目录及包名等。通过IDEA右键菜单即可启动代码生成。具体配置和示例详见文档。
37 2
|
4月前
|
存储 SQL 安全
【数据库高手的秘密武器:深度解析SQL视图与存储过程的魅力——封装复杂逻辑,实现代码高复用性的终极指南】
【8月更文挑战第31天】本文通过具体代码示例介绍 SQL 视图与存储过程的创建及应用优势。视图作为虚拟表,可简化复杂查询并提升代码可维护性;存储过程则预编译 SQL 语句,支持复杂逻辑与事务处理,增强代码复用性和安全性。通过创建视图 `high_earners` 和存储过程 `get_employee_details` 及 `update_salary` 的实例,展示了二者在实际项目中的强大功能。
43 1
|
3月前
|
前端开发 数据库 开发者
数据模型(数据库表设计)生成代码
BizWorks ToolKit 插件集成 Mybatis-Plus 代码生成工具,支持从数据库表批量生成代码,简化开发流程。本文详细介绍配置方法及项目示例,包括配置文件格式、生成选项及具体操作步骤,帮助开发者快速实现代码同步更新。配置文件 `.mp.yaml` 支持自定义输出目录、生成组件等,适用于多种项目结构。
55 0