设为首页 收藏本站
查看: 1427|回复: 0

[经验分享] Android中使用嵌入式关系型SQLite数据库存储数据

[复制链接]

尚未签到

发表于 2016-12-1 11:13:38 | 显示全部楼层 |阅读模式

  除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据。
在Android的平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s)等数据类型,
只不过在运算或保存时会转成对应的五种数据类型。
SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么;
SQLite中还可以进行解析不部分的SQL语句,所以用起来挺方便的;
在使用SQLite中,Android系统为什么实现了SQLiteOpenHelper的抽象类,所以我去实现其中的方法,来让我们对数据进行管理创建于版本管理;
在类SQLiteOpenHelper的帮助类是,
我们去实现
onCreate(SQLiteDatabase db), onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)这两个方法
①:
public abstract void onCreate (SQLiteDatabase db)当数据库第一次被创建的时候去调用,在onCreate()方法里面可以生成数据库表结构和添加一些应用使用到的初始化数据,返回DataBase
②:
public abstract void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion)当数据库需要更新的时候调用,调用的时候需要先删除原来的表,或者去更新新的版本号
当然我们还会用到
getReadableDatabase()与个头WritableDatabase()这两个方法来进行获取数据的实例
但getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写;
getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,
不过很幸运的时候,加入打开失败,还是继续尝试用只读方式去打开数据库

  Demo:以学生信息管理来举例
Student_Model:

package com.jiangqq.model;import java.io.Serializable;/*** 学生类的model类* * @author jiangqq* */public class Student implements Serializable{private Integer stu_id;private String name;private String gender;private Short age;private String telphone;public Student() {super();}public Student(String name, String gender, Short age, String telphone) {super();this.name = name;this.gender = gender;this.age = age;this.telphone = telphone;}public Student(Integer id, String name, String gender, Short age,String telphone) {super();this.stu_id = id;this.name = name;this.gender = gender;this.age = age;this.telphone = telphone;}public Integer getId() {return stu_id;}public void setId(Integer id) {this.stu_id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public Short getAge() {return age;}public void setAge(Short age) {this.age = age;}public String getTelphone() {return telphone;}public void setTelphone(String telphone) {this.telphone = telphone;}@Overridepublic String toString() {return "Student [id=" + stu_id + ", name=" + name + ", gender="+ gender + ", age=" + age + ", telphone=" + telphone + "]";}}
  首先先写数据库帮助类:
  
package com.jiangqq.service;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;public class DBOpenHelper extends SQLiteOpenHelper{private static final String DB_NAME = "student.db";private static final int VERSION = 1;private static final String CREATE_TABLE = "create table student (stu_id integer primary key autoincrement,name text,gender text,age integer,telphone text);";public DBOpenHelper(Context context) {super(context, DB_NAME, null, VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(CREATE_TABLE);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL("DROP TABLE IF EXISTS student");onCreate(db);}}  
至此数据库的帮助类已经基本完成,接下来要用SQLiteDatabase类中的方法来对学生信息进行管理了;  基本会用到以上的一个主要的方法:
   添加 ①:public long insert (String table, String nullColumnHack, ContentValues values)
      values是一个键值对,如果插入成功返回此时新插入的行号,失败返回-1
   删除 ②:public int delete (String table, String whereClause, String[] whereArgs)

修改 ③:public int update (String table, ContentValues values, String whereClause, String[] whereArgs)

      返回被修改的列数
   查询 ④:public Cursor query (boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, Stringlimit)
      查询的方法一共有三个重载的方法,其中各种参数意思如下(如果其中某个参数不设置,可以指定为null):
    
table:表名。相当于select语句from关键字后面的部分。如果是多表联合查询,可以用逗号将两个表名分开。

columns:要查询出来的列名。相当于select语句select关键字后面的部分。

selection:查询条件子句,相当于select语句where关键字后面的部分,在条件子句允许使用占位符“?”

selectionArgs:对应于selection语句中占位符的值,值在数组中的位置与占位符在语句中的位置必须一致,否则就会有异    常。

groupBy:相当于select语句groupby关键字后面的部分

having:相当于select语句having关键字后面的部分

orderBy:相当于select语句orderby关键字后面的部分

limit:指定偏移量和获取的记录数,相当于select语句limit关键字后面的部分     
然后是对学生信息的增删查改的方法类:
  
package com.jiangqq.service;/*** 该类进行对学生信息的数据库的增删查改操作的封装*/import java.util.ArrayList;import java.util.List;import com.jiangqq.model.Student;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;public class DBDatabase{private DBOpenHelper dbOpenHelper;private SQLiteDatabase dbDatabase;public DBDatabase(Context context) {this.dbOpenHelper = new DBOpenHelper(context);}// 添加public void add(Student student) {dbDatabase = dbOpenHelper.getWritableDatabase();ContentValues values = new ContentValues();values.put("name", student.getName());values.put("gender", student.getGender());values.put("age", student.getAge());values.put("telphone", student.getTelphone());dbDatabase.insert("student", null, values);if (dbDatabase != null) {dbDatabase.close();}}// 删除操作public void delete(Integer id) {dbDatabase = dbOpenHelper.getWritableDatabase();dbDatabase.delete("student", "stu_id= ? ",new String[] { String.valueOf(id) });if (dbDatabase != null) {dbDatabase.close();}}// 修改public void update(Student student, Integer id) {dbDatabase = dbOpenHelper.getWritableDatabase();ContentValues values = new ContentValues();values.put("name", student.getName());values.put("gender", student.getGender());values.put("age", student.getAge());values.put("telphone", student.getTelphone());dbDatabase.update("student", values, "stu_id=?",new String[] { String.valueOf(id) });if (dbDatabase != null) {dbDatabase.close();}}// 查询public List<Student> findAll() {dbDatabase = dbOpenHelper.getWritableDatabase();Cursor cursor = dbDatabase.query("student", new String[] { "stu_id","name", "gender", "age", "telphone" }, null, null, null, null,"stu_id asc");List<Student> list = new ArrayList<Student>();Student student = null;while (cursor.moveToNext()) {student = new Student();student.setId(cursor.getInt(0));student.setName(cursor.getString(1));student.setGender(cursor.getString(2));student.setAge(cursor.getShort(3));student.setTelphone(cursor.getString(4));list.add(student);}if (dbDatabase != null) {dbDatabase.close();}return list;}public Student findById(Integer id) {dbDatabase = dbOpenHelper.getWritableDatabase();Cursor cursor = dbDatabase.query("student", new String[] { "stu_id","name", "gender", "age", "telphone" }, "stu_id=?",new String[] { String.valueOf(id) }, null, null, null);int count = cursor.getCount();if (count != 0) {cursor.moveToNext();Student student = new Student(cursor.getInt(cursor.getColumnIndex("stu_id")), cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("gender")), cursor.getShort(cursor.getColumnIndex("age")), cursor.getString(cursor.getColumnIndex("telphone")));if (dbDatabase != null) {dbDatabase.close();}return student;} else {{return null;}}}}
  方法单元测试类:
  
package com.jiangqq.service.test;import java.util.List;import com.jiangqq.model.Student;import com.jiangqq.service.DBDatabase;import android.test.AndroidTestCase;import android.util.Log;public class SQLiteDatabaseTest extends AndroidTestCase{private static final String TAG = "SQLiteDatabaseTest";public void testAdd() {Student student = null;DBDatabase database = new DBDatabase(this.getContext());student = new Student();student.setName("李华");student.setGender("男");student.setAge((short) 20);student.setTelphone("18355101099");database.add(student);student = new Student();student.setName("李华");student.setGender("男");student.setAge((short) 20);student.setTelphone("18355101099");database.add(student);Log.i(TAG, "添加成功");}public void testDelete() {DBDatabase database = new DBDatabase(this.getContext());database.delete(1);Log.i(TAG, "删除成功");}public void testUpdate() {DBDatabase database = new DBDatabase(this.getContext());Student student = new Student("李华", "男", (short) 20, "1388888888");database.update(student, 1);Log.i(TAG, "修改成功");}public void testFindAll() {DBDatabase database = new DBDatabase(this.getContext());List<Student> list = database.findAll();for (int y = 0; y < list.size(); y++) {// System.out.println(((Student) list.get(y)).toString());Log.i(TAG, ((Student) list.get(y)).toString());}}public void testFindById() {DBDatabase database = new DBDatabase(this.getContext());Student student = database.findById(2);Log.i(TAG, student.toString());}}
  单元测试截图:
   DSC0000.gif

  

  时间仓促,上面还有很多不足,晚些时候还是继续修改一下

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-308168-1-1.html 上篇帖子: python用法:处理sqlite中的中文字符时遇到的问题 下篇帖子: Android黑群出品:SQLite数据库的使用和升级
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表