android开发中的数据库SQLite的使用
其实学习android很久了,关于数据存储,之前学习的时候也一同学习过,编程这些东西很久没用都忘得差不多了,最近做个项目要用到,所以又学习了一遍。
android中关于数据的存储有好几种,这次主要是SQLite的使用。
首先说一点,我的技术很烂,原理什么的不说了,就是讲一下怎么使用,包括“增删改查”这几个操作。
使用数据库的前提是有数据库,有表,所以我们首先是要有一个数据库,然后还得建一张表(至少一张表)。sql语句就是“create table XXX()”。作为一个数据库系统,SQLite也是遵守SQL92标准的,和其他的数据库都差不多,所以有过数据库开发经验的对这些sql语句都不陌生。
开发中使用数据库
创建数据库
android中提供了SQLiteOpenHelper这个类来帮助你管理数据库。包括创建和更新数据库。所以你只要继承SQLiteOpenHelper类来对数据库进行管理就行。
public class DBHelper extends SQLiteOpenHelper {private static final String DATABASE_NAME = "test.db";private static final int DATABASE_VERSION = 1;public DBHelper(Context context){super(context,DATABASE_NAME,null,DATABASE_VERSION);}@Overridepublic void onCreate(SQLiteDatabase db){db.execSQL("CREATE TABLE IF NOT EXISTS person(_id INTEGER PRIMARY KEY AUTOINCREMENT," +" name VARCHAR,age INTEGER, info TEXT)");//建表,对数据库进行操作等}@Overridepublic void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){db.execSQL("ALTER TABLE person COLUMN other STRING");} }
SQLiteOpenHelper类的构造函数有四个参数
public SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version) {this(context, name, factory, version, null);}
这是我在sdk源代码SQLiteOpenHelper类中复制的。context代表上下文,name是数据库名字,factory是游标工厂,一般情况下为null值,version是数据库版本,软件在今后的升级中会用到。
在构造函数中就会创建数据库。
使用数据库
数据库已经创建好,通常我们通过getReadAbleDatabase()或getWriteableDatabase()方法来获取一个数据库实例。可以在onCreate()方法中对数据库进行操作。不过为了便于管理,还是建议大家重新写一个专门的工具类。
创建表
其实在onCreate()方法中就是在创建表。
db.execSQL("CREATE TABLE IF NOT EXISTS person(_id INTEGER PRIMARY KEY AUTOINCREMENT," +" name VARCHAR,age INTEGER, info TEXT)"); 表名是person,_id是主键,为自增长,name是verchar型,age是integer型,info是text型。
表操作
表的操作就是增删改查,android中提供了两种方法(就我知道的)。分别是sql语句和封装好的insert(),delete(),update(),query()。后边的这些方法也是对sql语句的封装。
增
db.execSQL("insert into ....");
还有就是
ContentValues cv = new ContentValues();
cv.put();
cv.put();
db.insert("tableName",getNullColunmHack(),cv);
函数原型是insert(String table, String nullColumnHack, ContentValues values),其实insert()的底层也是execSQL()。
删
和添加的操作差不多。db.execSQL()和db.delete()
改
和上边两个操作的也是相同的。
查
因为查询的结果是返回一个游标(Cursor)。rawQuery(String sql, String[] selectionArgs)。通过移动游标来进行数据的查询。
1 Cursor c = db.rawQuery("SELECT * FROM person", null);2 while(c.moveToNext()){3 Person p = new Person();4 p.set_id(c.getInt(c.getColumnIndex("_id")));5 p.setName(c.getString(c.getColumnIndex("name")));6 p.setAge(c.getInt(c.getColumnIndex("age")));7 p.setInfo(c.getString(c.getColumnIndex("info")));8 persons.add(p);9 } 10 c.close();
所有的操作也差不多就是这些。
最后添加几张截图。
最后是全部源代码
activity.java
1 package com.sqlitedemo.activity;2 3 import android.app.Activity;4 import android.os.Bundle;5 import android.view.View;6 import android.widget.Button;7 import android.widget.ListView;8 import android.widget.SimpleAdapter;9 import android.widget.Toast;10 11 import com.tiancz.sqlitedemo.R;12 import com.tiancz.sqlitedemo.com.tiancz.sqlitedemo.activity00_entity.DBManager;13 import com.tiancz.sqlitedemo.com.tiancz.sqlitedemo.activity00_entity.Person;14 15 import java.util.ArrayList;16 import java.util.HashMap;17 import java.util.List;18 import java.util.Map;19 20 /**21 * Created by tiancz on 2015/3/7.22 */23 public class activity00 extends Activity {24 25 private DBManager dm;26 private ListView lv;27 28 private Button add;29 private Button query;30 private Button update;31 private Button delete;32 private Button drop;33 @Override34 protected void onCreate(Bundle savedInstanceState) {35 super.onCreate(savedInstanceState);36 setContentView(R.layout.activity00);37 38 lv = (ListView)findViewById(R.id.lv_00);39 query = (Button)findViewById(R.id.query00);40 add = (Button)findViewById(R.id.add00);41 update = (Button)findViewById(R.id.update00);42 delete = (Button)findViewById(R.id.deleteAll00);43 drop = (Button)findViewById(R.id.drop00);44 45 dm = new DBManager(this);46 47 add.setOnClickListener(new View.OnClickListener() {48 @Override49 public void onClick(View v) {50 add(v);51 }52 });53 54 query.setOnClickListener(new View.OnClickListener() {55 @Override56 public void onClick(View v) {57 query(v);58 }59 });60 61 update.setOnClickListener(new View.OnClickListener() {62 @Override63 public void onClick(View v) {64 update(v);65 }66 });67 68 delete.setOnClickListener(new View.OnClickListener() {69 @Override70 public void onClick(View v) {71 deleteALL(v);72 }73 });74 75 // drop.setOnClickListener(new View.OnClickListener() {76 // @Override77 // public void onClick(View v) {78 // dropTable(v);79 // }80 // });81 }82 83 84 @Override85 protected void onDestroy(){86 super.onDestroy();87 dm.closeDB();88 }89 90 public void add(View view){91 List<Person> persons = new ArrayList<>();92 Person p1 = new Person("tom",21,"lively boy");93 Person p2 = new Person("bill",23,"handsome");94 Person p3 = new Person("gate",22,"sexy boy");95 Person p4 = new Person("joe",24,"hot boy");96 Person p5 = new Person("jhon",29,"pretty");97 98 persons.add(p1);99 persons.add(p2); 100 persons.add(p3); 101 persons.add(p4); 102 persons.add(p5); 103 104 dm.add(persons); 105 } 106 public void update(View view){ 107 Person p = new Person(); 108 p.setName("jhon"); 109 p.setAge(40); 110 dm.updateAge(p); 111 } 112 113 public void deleteALL(View view){ 114 dm.delete(); 115 } 116 117 public void delete(View view){ 118 Person p = new Person(); 119 p.setAge(30); 120 dm.deleteOldPerson(p); 121 } 122 123 // public void dropTable(View view){ 124 // dm.dropTable(); 125 // } 126 127 public void query(View view){ 128 List<Person>persons = dm.findAllPerson(); 129 ArrayList<Map<String,String>> list = new ArrayList<>(); 130 for (Person p:persons){ 131 HashMap<String,String>map = new HashMap<>(); 132 map.put("name",p.getName()); 133 map.put("info","No."+p.get_id()+" "+p.getAge()+" years old,"+p.getInfo()); 134 list.add(map); 135 } 136 SimpleAdapter adapter = new SimpleAdapter(this,list,android.R.layout.simple_list_item_2, 137 new String[]{"name","info"},new int[]{android.R.id.text1,android.R.id.text2}); 138 lv.setAdapter(adapter); 139 if(list.isEmpty()){ 140 Toast.makeText(this,"列表里还没人呢",Toast.LENGTH_SHORT).show(); 141 } 142 } 143 }
activity.xml
1 <?xml version="1.0" encoding="utf-8"?>2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"3 android:layout_width="match_parent"4 android:layout_height="match_parent"5 android:orientation="vertical">6 7 <Button8 android:id="@+id/add00"9 android:layout_width="wrap_content" 10 android:layout_height="wrap_content" 11 android:text="Add"/> 12 <Button 13 android:id="@+id/update00" 14 android:layout_width="wrap_content" 15 android:layout_height="wrap_content" 16 android:text="update"/> 17 <Button 18 android:id="@+id/deleteAll00" 19 android:layout_width="wrap_content" 20 android:layout_height="wrap_content" 21 android:text="deleteAll"/> 22 <Button 23 android:id="@+id/delete00" 24 android:layout_width="wrap_content" 25 android:layout_height="wrap_content" 26 android:text="delete"/> 27 <Button 28 android:id="@+id/drop00" 29 android:layout_width="wrap_content" 30 android:layout_height="wrap_content" 31 android:text="drop"/> 32 <Button 33 android:id="@+id/query00" 34 android:layout_width="wrap_content" 35 android:layout_height="wrap_content" 36 android:text="query"/> 37 38 <ListView 39 android:id="@+id/lv_00" 40 android:layout_width="fill_parent" 41 android:layout_height="wrap_content"> 42 </ListView> 43 </LinearLayout>
DBHelper.java
1 package com.tiancz.sqlitedemo.com.tiancz.sqlitedemo.activity00_entity;2 3 import android.content.Context;4 import android.database.sqlite.SQLiteDatabase;5 import android.database.sqlite.SQLiteOpenHelper;6 7 /**8 * Created by tiancz on 2015/3/8.9 */ 10 public class DBHelper extends SQLiteOpenHelper { 11 private static final String DATABASE_NAME = "test.db"; 12 private static final int DATABASE_VERSION = 1; 13 public DBHelper(Context context){ 14 super(context,DATABASE_NAME,null,DATABASE_VERSION); 15 } 16 17 @Override 18 public void onCreate(SQLiteDatabase db){ 19 db.execSQL("CREATE TABLE IF NOT EXISTS person(_id INTEGER PRIMARY KEY AUTOINCREMENT," + 20 " name VARCHAR,age INTEGER, info TEXT)"); 21 22 } 23 24 @Override 25 public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){ 26 db.execSQL("ALTER TABLE person COLUMN other STRING"); 27 } 28 }
DBManager.java
1 package com.tiancz.sqlitedemo.com.tiancz.sqlitedemo.activity00_entity;2 3 import android.content.ContentValues;4 import android.content.Context;5 import android.database.Cursor;6 import android.database.sqlite.SQLiteDatabase;7 8 import java.util.ArrayList;9 import java.util.List; 10 11 /** 12 * Created by tiancz on 2015/3/8. 13 */ 14 public class DBManager { 15 private DBHelper helper; 16 private SQLiteDatabase db; 17 18 public DBManager(Context context){ 19 helper = new DBHelper(context); 20 db = helper.getWritableDatabase(); 21 } 22 23 public void add(List<Person> persons){ 24 db.beginTransaction(); 25 try{ 26 for (Person p:persons){ 27 db.execSQL("INSERT INTO person VALUES(null,?,?,?)", 28 new Object[]{p.getName(),p.getAge(),p.getInfo()}); 29 } 30 db.setTransactionSuccessful(); 31 }catch(Exception e){ 32 e.printStackTrace(); 33 }finally { 34 db.endTransaction(); 35 } 36 } 37 38 public void updateAge(Person p){ 39 ContentValues cv = new ContentValues(); 40 cv.put("age",p.getAge()); 41 db.update("person",cv,"name=?",new String[]{p.getName()}); 42 } 43 44 public void delete(){ 45 db.execSQL("delete from person where name='tom'"); 46 db.execSQL("delete from person where name='bill'"); 47 db.execSQL("delete from person where name='gate'"); 48 db.execSQL("delete from person where name='joe'"); 49 db.execSQL("delete from person where name='jhon'"); 50 } 51 52 public void deleteOldPerson(Person p){ 53 db.delete("person","age=?",new String[]{String.valueOf(p.getAge())}); 54 } 55 56 public List<Person> findAllPerson(){ 57 ArrayList<Person> persons = new ArrayList<Person>(); 58 Cursor c = db.rawQuery("SELECT * FROM person", null); 59 while(c.moveToNext()){ 60 Person p = new Person(); 61 p.set_id(c.getInt(c.getColumnIndex("_id"))); 62 p.setName(c.getString(c.getColumnIndex("name"))); 63 p.setAge(c.getInt(c.getColumnIndex("age"))); 64 p.setInfo(c.getString(c.getColumnIndex("info"))); 65 persons.add(p); 66 } 67 c.close(); 68 return persons; 69 } 70 71 // public void dropTable(){ 72 // db.execSQL("drop table person"); 73 // } 74 75 public void closeDB(){ 76 db.close(); 77 } 78 79 80 }
Person.java
1 package com.tiancz.sqlitedemo.com.tiancz.sqlitedemo.activity00_entity;2 3 /**4 * Created by tiancz on 2015/3/8.5 */6 public class Person {7 private int _id;8 private String name;9 private int age; 10 private String info; 11 12 public Person(){} 13 14 public Person(String name,int age,String info){ 15 this.name=name; 16 this.age=age; 17 this.info=info; 18 } 19 20 public int get_id() { 21 return _id; 22 } 23 24 public void set_id(int _id) { 25 this._id = _id; 26 } 27 28 public int getAge() { 29 return age; 30 } 31 32 public void setAge(int age) { 33 this.age = age; 34 } 35 36 public String getName() { 37 return name; 38 } 39 40 public void setName(String name) { 41 this.name = name; 42 } 43 44 public String getInfo() { 45 return info; 46 } 47 48 public void setInfo(String info) { 49 this.info = info; 50 } 51 }
这就是全部的代码。
总结
刚开始做的时候忘了实例化DBManager,所以导致无法对数据库进行操作,一直显示的空指针异常,看了好久才发现忘了这一句
dm = new DBManager(this);
对于信息越来越多,数据库的使用越发显得重要。学习android,数据库的学习必不可少。
android开发中的数据库SQLite的使用相关推荐
- SQLite数据库及在Android开发中的基本使用
SQLite数据库及在Android开发中的基本使用 SQLite数据库的特点 轻量级数据库,无需搭建服务器. SQLite环境配置 这里提供从官网下载的方法,如果有Android Studio的项目 ...
- android中资源文件的两种访问方式,在android开发中进行数据存储与访问的多种方式介绍...
在android开发中进行数据存储与访问的多种方式介绍 更新时间:2013年06月07日 16:24:23 作者: 很多时候我们的软件需要对处理后的数据进行存储或再次访问,Android为数据存储 ...
- Android数据存储:数据库基础,在Android应用中使用数据库,附加Menu菜单选项的一些说明
为什么**持久性数据很重要: 在计分器那个应用中,是将球队得分存储在变量里,当我们旋转应用时Activity被销毁,得分记录也没有了.将设备旋转为新的方向时,Activity被重现创建,得分又变成默认 ...
- android 开发使用adb操作sqlite
android 开发使用adb操作sqlite. 1.启动模拟器或连接android实体机 2.在命令行输入:adb shell 3.进入目录:data/data/应用程序包名/databases/ ...
- XamarinSQLite教程在Xamarin.Android项目中提取数据库文件
XamarinSQLite教程在Xamarin.Android项目中提取数据库文件 由于不能直接打开该文件,开发者需要先将数据库文件从Android系统中提取出来.操作步骤如下. (5)选择MyDoc ...
- XamarinSQLite教程在Xamarin.Android项目中定位数据库文件
XamarinSQLite教程在Xamarin.Android项目中定位数据库文件 实际开发中,经常需要验证数据库操作的正确性.这个时候,需要打开数据库文件,进行确认.下面是如何找到MyDocumen ...
- android权限--android开发中的权限及含义(下)
android权限--android开发中的权限及含义(下) android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权 ...
- android中的mvp模式怎么定义,详解MVP模式在Android开发中的应用
一.MVP介绍 随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责.为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数据的可视化以及与用户的交互,同时让Mode ...
- Android开发中保存数据的四种方法方法
本文来自:安卓航班网 在Android开发中我们会接触到四种数据存储方式,每种存储方式都各有不同:以下安卓航班分别列举了Android开发中的不同存储方式的特点. 一,Preferences Pref ...
最新文章
- 简单ajax类, 比较小, 只用ajax功能时, 可以考虑它
- openais的前世今生
- PyCharm调试错误
- 前端学习(2329):angular之路由
- 你的食物变质没?用AI算法来检测一下吧
- sp烘焙流程_小手雷-PBR材质流程(一)——(基本材质)
- android 翻转切换view,Android ViewFlipper翻转视图使用详解
- 一个 冒泡排序 和 选择排序 的简单c程序
- 6-2 第六天 规划项目功能分布
- pythonfor循环语句例子_Python for循环学习总结
- 算法笔记--无向图的桥、割点、边双连通分量和点双连通分量
- 友元函数类图_要达到形式的公平,需要具备的前提条件是()。
- STM32笔记 (十)定时器(基本定时器)利用基本定时器实现毫秒延时
- java 自定义列表_自定义列表标签
- 三极管实现的锁存电路
- cygwin3下编译redis6.2
- NeRF 神经辐射场
- openwrt 配置过程
- 英语基础知识: 并列结构
- 浅谈mysql的执行计划是何方神圣
热门文章
- centos7源代码安装mysql5.7_CentOS7源码编译安装MySQL5.7.11
- 迭代反投影法代码_程序员的数学笔记3--迭代法
- vue 判断同一数组内的值是否一直_前端代码+后端API,值得一学的Vue高仿音乐播放器实战项目
- mysql不能删除外键吗,MySQL不能删除外键约束所需的索引
- 过于离谱,我实现憋不住了!
- PID算法搞不懂?看这篇文章。
- php编程 第一节,PHP第一节php简介_PHP
- HDLBits答案(9)_卡诺图与最简SOP式
- VHDL编码器和译码器的设计
- python3键盘事件_python+selenium3 鼠标事件和键盘事件