Android中SQLite的基本用法

来源:互联网 发布:内存 知乎 编辑:程序博客网 时间:2024/05/16 14:15

什么情况下我们才用数据库做数据存储? 大量数据结构相同的数据需要存储时。
mysql sqlserver2000  sqlite 嵌入式 轻量级

本文主要针对在安卓中创建数据库!

一.SQLite的介绍


1.SQLite数据类型


一般数据采用的固定的静态数据类型,而SQLite采用的是动态数据类型会根据存入值自动判断。SQLite具有以下五种常用的数据类型:

NULL: 这个值为空值

VARCHAR(n):长度不固定且其最大长度为 n 的字串,n不能超过 4000。

CHAR(n):长度固定为n的字串,n不能超过 254。

INTEGER: 值被标识为整数,依据值的大小可以依次被存储为1,2,3,4,5,6,7,8.

REAL: 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号.

TEXT: 值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE).

BLOB: 值是BLOB数据块,以输入的数据格式进行存储。如何输入就如何存储,不改  变格式。

DATA :包含了 年份、月份、日期。

TIME: 包含了 小时、分钟、秒。


二. SQLiteOpenHelper


该类是SQLiteDatabase一个辅助类。这个类主要生成一  个数据库,并对数据库的版本进行管理。当在程序当中调用这个类的方法getWritableDatabase()或者 getReadableDatabase()方法的时候,如果当时没有数据,那么Android系统就会自动生成一个数据库。 SQLiteOpenHelper 是一个抽象类,我们通常需要继承它,并且实现里面的3个函数:

1.onCreate(SQLiteDatabase)

在数据库第一次生成的时候会调用这个方法,也就是说,只有在创建数据库的时候才会调用,当然也有一些其它的情况,一般我们在这个方法里边生成数据库表。

2.  onUpgrade(SQLiteDatabase,int,int)

 
当数据库需要升级的时候,Android系统会主动的调用这个方法。一般我们在这个方法里边删除数据表,并建立新的数据表,当然是否还需要做其他的操作,完全取决于应用的需求。

3.  onOpen(SQLiteDatabase):

这是当打开数据库时的回调函数,一般在程序中不是很常使用。


三.SQLiteDatabase的介绍

Android提供了创建和是用SQLite数据库的API。SQLiteDatabase代表一个数据库对象,提供了操作数据库的一些方法。在Android的SDK目录下有sqlite3工具,我们可以利用它创建数据库、创建表和执行一些SQL语句。下面是SQLiteDatabase的常用方法。 

SQLiteDatabase的常用方法 

方法名称
方法表示含义
openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory  factory)
打开或创建数据库
insert(String table,String nullColumnHack,ContentValues  values)
插入一条记录
delete(String table,String whereClause,String[]  whereArgs)
删除一条记录
query(String table,String[] columns,String selection,String[]  selectionArgs,String groupBy,String having,String  orderBy)
查询一条记录
update(String table,ContentValues values,String whereClause,String[]  whereArgs)
修改记录
execSQL(String sql)
执行一条SQL语句
close()

 Android下数据库操作:

具体步骤代码

1、创建数据库和创建表

创建一个类集成SqliteOpenHelper,需要添加一个构造方法,实现两个方法oncreate ,onupgrade
构造方法中的参数介绍:

1、创建数据库

public MySqliteOpenHelper(Context context) {//context :上下文   , name:数据库文件的名称    factory:用来创建cursor对象,默认为null //version:数据库的版本号,从1开始,如果发生改变,onUpgrade方法将会调用,4.0之后只能升不能将super(context, "info.db", null,1);}


2.复写oncreate和onupgrdate方法:
oncreate方法是数据库第一次创建的时候会被调用;  特别适合做表结构的初始化,需要执行sql语句;

onUpgrade数据库版本号发生改变时才会执行; 特别适合做表结构的修改

下面的代码创建了一张用户表,属性列为:id(主键并且自动增加)、sname(学生姓名)、snumber(学号)

@Overridepublic void onCreate(SQLiteDatabase db) {//通过SQLiteDatabase执行一个创建表的sql语句//创建表SQL语句       String stu_table="create table usertable(_id integer primary key autoincrement,sname text,snumber text)";       //执行SQL语句       db.execSQL(stu_table);}

3.创建这个帮助类的一个对象,调用getReadableDatabase()方法,会帮助我们创建打开一个数据库

帮助类对象中的getWritableDatabase 和 getReadableDatabase都可以帮助我们获取一个数据库操作对象SqliteDatabase.

区别:

getReadableDatabase:
先尝试以读写方式打开数据库,如果磁盘空间满了,他会重新尝试以只读方式打开数据库。
getWritableDatabase:
直接以读写方式打开数据库,如果磁盘空间满了,就直接报错。

代码如下:

//创建一个帮助类对象        MySqliteOpenHelper mySqliteOpenHelper = new MySqliteOpenHelper(MainActivity.this);        //调用getReadableDatabase方法,来初始化数据库的创建        SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase();


2、插入数据
插入数据有两种方法:
①SQLiteDatabase的insert(String table,String nullColumnHack,ContentValues  values)方法,
  参数1  表名称,
  参数2  空列的默认值
  参数3  ContentValues类型的一个封装了列名称和列值的Map;
②编写插入数据的SQL语句,直接调用SQLiteDatabase的execSQL()方法来执行
第一种方法的代码:

private void insert(SQLiteDatabase db){   //实例化常量值   ContentValues cValue = new ContentValues();   //添加用户名   cValue.put("sname","xiaoming");   //添加密码   cValue.put("snumber","01005");   //调用insert()方法插入数据   db.insert("stu_table",null,cValue);   }   
第二种方法的代码:

private void insert(SQLiteDatabase db){   //插入数据SQL语句   String stu_sql="insert into stu_table(sname,snumber) values('xiaoming','01005')";   //执行SQL语句   db.execSQL(sql);   }   
3、删除数据

删除数据也有两种方法:

①调用SQLiteDatabase的delete(String table,String whereClause,String[]  whereArgs)方法
参数1  表名称 
参数2  删除条件
参数3  删除条件值数组

②编写删除SQL语句,调用SQLiteDatabase的execSQL()方法来执行删除。


第一种方法的代码:

private void delete(SQLiteDatabase db) {   //删除条件   String whereClause = "id=?";   //删除条件参数   String[] whereArgs = {String.valueOf(2)};   //执行删除   db.delete("stu_table",whereClause,whereArgs);   }   

第二种方法的代码:

private void delete(SQLiteDatabase db) {   //删除SQL语句   String sql = "delete from stu_table where _id = 6";   //执行SQL语句   db.execSQL(sql);   }   
4、修改数据

修改数据有两种方法:

①调用SQLiteDatabase的update(String table,ContentValues values,String  whereClause, String[]  whereArgs)方法
参数1  表名称
参数2  跟行列ContentValues类型的键值对Key-Value
参数3  更新条件(where字句)
参数4  更新条件数组

②编写更新的SQL语句,调用SQLiteDatabase的execSQL执行更新。

第一种方法的代码:

private void update(SQLiteDatabase db) {   //实例化内容值 ContentValues values = new ContentValues();   //在values中添加内容   values.put("snumber","101003");   //修改条件   String whereClause = "id=?";   //修改添加参数   String[] whereArgs={String.valuesOf(1)};   //修改   db.update("usertable",values,whereClause,whereArgs);   }   
第二种方法的代码:

private void update(SQLiteDatabase db){   //修改SQL语句   String sql = "update stu_table set snumber = 654321 where id = 1";   //执行SQL   db.execSQL(sql);   }   
5、查询数据

在Android中查询数据是通过Cursor类来实现的,当我们使用SQLiteDatabase.query()方法时,会得到一个Cursor对象,Cursor指向的就是每一条数据。它提供了很多有关查询的方法,具体方法如下:

public  Cursor query(String table,String[] columns,String selection,String[]  selectionArgs,String groupBy,String having,String orderBy,String limit);

各个参数的意义说明:

参数table:表名称

参数columns:列名称数组

参数selection:条件字句,相当于where

参数selectionArgs:条件字句,参数数组

参数groupBy:分组列

参数having:分组条件

参数orderBy:排序列

参数limit:分页查询限制

参数Cursor:返回值,相当于结果集ResultSet

Cursor是一个游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等.

Cursor游标常用方法

方法名称
方法描述
getCount()
获得总的数据项数
isFirst()
判断是否第一条记录
isLast()
判断是否最后一条记录
moveToFirst()
移动到第一条记录
moveToLast()
移动到最后一条记录
move(int offset)
移动到指定记录
moveToNext()
移动到下一条记录
moveToPrevious()
移动到上一条记录
getColumnIndexOrThrow(String  columnName)
根据列名称获得列索引
getInt(int columnIndex)
获得指定列索引的int类型值
getString(int columnIndex)
获得指定列缩影的String类型值

下面就是用Cursor来查询数据库中的数据,具体代码如下:

private void query(SQLiteDatabase db) {   //查询获得游标   Cursor cursor = db.query ("usertable",null,null,null,null,null,null);     //判断游标是否为空   if(cursor.moveToFirst() {   //遍历游标   for(int i=0;i<cursor.getCount();i++){   cursor.move(i);   //获得ID   int id = cursor.getInt(0);   //获得用户名   String username=cursor.getString(1);   //获得密码   String password=cursor.getString(2);   //输出用户信息 System.out.println(id+":"+sname+":"+snumber);   }   }   }  
6、删除指定表
编写插入数据的SQL语句,直接调用SQLiteDatabase的execSQL()方法来执行

private void drop(SQLiteDatabase db){   //删除表的SQL语句   String sql ="DROP TABLE stu_table";   //执行SQL   db.execSQL(sql);   }   
下面的小程序基本实现了数据库的简单操作,当然,里面的数据都已经写死了,大家有兴趣的可以写一个Bean类来盛装数据,这样可以有利于程序扩展,也可以锻炼一下自己的数据库操作。

示例代码:

UI:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >    <Button        android:onClick="createDatabase"        android:id="@+id/createDatabase"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text="创建数据库" />    <Button        android:onClick="updateDatabase"        android:id="@+id/updateDatabase"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text="更新数据库" />    <Button        android:onClick="insert"        android:id="@+id/insert"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text="插入数据" />    <Button        android:onClick="update"        android:id="@+id/update"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text="更新数据" />    <Button        android:onClick="query"        android:id="@+id/query"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text="查询数据" />    <Button        android:onClick="delete"        android:id="@+id/delete"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text="删除数据" /></LinearLayout>

MainActivity代码:

package com.example.SQLite_test;import com.example.SQLite_test.StuDBHelper;import android.app.Activity;import android.content.ContentValues;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity {private static final String TAG = "TestSQLite";@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}// 创建数据库的方法public void createDatabase(View v) {// 创建StuDBHelper对象StuDBHelper dbHelper = new StuDBHelper(MainActivity.this, "stu_db", null, 1);// 得到一个可读的SQLiteDatabase对象SQLiteDatabase db = dbHelper.getReadableDatabase();}// 更新数据库的方法public void updateDatabase(View v) {// 数据库版本的更新,由原来的1变为2StuDBHelper dbHelper = new StuDBHelper(MainActivity.this, "stu_db", null, 2);SQLiteDatabase db = dbHelper.getReadableDatabase();}// 插入数据的方法public void insert(View v) {StuDBHelper dbHelper = new StuDBHelper(MainActivity.this, "stu_db", null, 1);// 得到一个可写的数据库SQLiteDatabase db = dbHelper.getWritableDatabase();/* * insert()参数注释 * 参数1:table: 表名 * 参数2:nullColumnHack:可以为空 标示添加一个空行 * 参数3:values:数据一行的值  * 返回值:代表添加这个新行的Id ,-1代表添加失败 */// 生成ContentValues对象 //key:列名,value:想插入的值ContentValues cv = new ContentValues();// 往ContentValues对象存放数据,键-值对模式//插入第一条数据cv.put("sname", "张三");cv.put("sage", 21);cv.put("ssex", "男");// 调用insert方法,将数据插入数据库db.insert("stu_table", null, cv);//插入第二条数据cv.put("sname", "王五");cv.put("sage", 23);cv.put("ssex", "男");// 调用insert方法,将数据插入数据库int count = (int) db.insert("stu_table", null, cv);Log.i(TAG, "插入------------->"+count+"行");// 关闭数据库db.close();}// 查询数据的方法public void query(View v) {StuDBHelper dbHelper = new StuDBHelper(MainActivity.this, "stu_db", null, 1);// 得到一个可写的数据库SQLiteDatabase db = dbHelper.getReadableDatabase();// 参数1:表名// 参数2:要想查询列名,如果null代表查询所有列// 参数3:selection:查询条件// 参数4:selectionArgs:条件占位符的参数值,// 参数5:分组方式// 参数6:having条件// 参数7:排序方式Cursor cursor = db.query("stu_table", new String[] { "sname", "sage", "ssex" }, null,null, null, null, null);while (cursor.moveToNext()) {String name = cursor.getString(cursor.getColumnIndex("sname"));String age = cursor.getString(cursor.getColumnIndex("sage"));String sex = cursor.getString(cursor.getColumnIndex("ssex"));System.out.println("query------->" + "姓名:" + name + " " + "年龄:" + age + " " + "性别:" + sex);}// 关闭数据库db.close();}// 修改数据的方法public void update(View v) {StuDBHelper dbHelper = new StuDBHelper(MainActivity.this, "stu_db", null, 1);// 得到一个可写的数据库SQLiteDatabase db = dbHelper.getWritableDatabase();ContentValues cv = new ContentValues();cv.put("sage", "20");cv.put("ssex", "女");String whereClause = "sname=?";String[] whereArgs = new String []{ "王五" };// 参数1 :是要更新的表名// 参数2 :是一个ContentValeus对象// 参数3 :whereClause:更新的条件// 参数4:whereArgs:更新条件的占位符的值// 返回值:成功修改多少行int count = db.update("stu_table", cv, whereClause, whereArgs);Log.i(TAG, "修改------------->"+count+"行");}// 删除数据的方法public void delete(View v) {StuDBHelper dbHelper = new StuDBHelper(MainActivity.this, "stu_db", null, 1);// 得到一个可写的数据库SQLiteDatabase db = dbHelper.getReadableDatabase();String whereClauses = "sname=?";String[] whereArgs = new String []{"张三"};//参数1:table :表名, , ;//参数2:whereClause: 删除条件//参数3:whereArgs:条件的占位符的参数 //返回值:成功删除多少行//调用delete方法,删除数据int count = db.delete("stu_table", whereClauses, whereArgs);Log.i(TAG, "删除------------->"+count+"行");}}

MySqliteOpenHelper代码如下:

package com.example.SQLite_test;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;import android.util.Log;public class MySqliteOpenHelper extends SQLiteOpenHelper {private static final String TAG = "TestSQLite";public static final int VERSION = 1;// 必须要有构造函数public MySqliteOpenHelper(Context context, String name, CursorFactory factory, int version) {super(context, name, factory, version);}// 当第一次创建数据库的时候,调用该方法public void onCreate(SQLiteDatabase db) {String sql = "create table stu_table(_id integer primary key autoincrement,sname varchar(20),sage int,ssex varchar(10))";// 输出创建数据库的日志信息Log.i(TAG, "create Database------------->");// execSQL函数用于执行SQL语句db.execSQL(sql);}// 当更新数据库的时候执行该方法public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// 输出更新数据库的日志信息Log.i(TAG, "update Database------------->");}}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 千牛账号在手机上被限制登录怎么办 违规的千牛账号被限制登录了怎么办 苹果id和锁屏密码忘记了怎么办 感应门的编程密码忘记了怎么办 交易猫买的号被找回了怎么办 uc上我的小说看不了怎么办 微信零钱忘记密码没有银行卡怎么办 九游平台冻结提不了现怎么办 计算机考试报名登录名忘记了怎么办 云顶扑克提现怎么提不出来怎么办 微信正在下载一直0kb怎么办 守望先锋运行时出现意外错误怎么办 信用卡暂停使用怎么办还能恢复吗 新刷乳胶漆墙面一碰一个坑怎么办 夏天开空调冻着了头疼打喷嚏怎么办 桑蚕丝衣服被沐浴露退了色怎么办 空间被别人知道了密码登录了怎么办 三星手机显示解析包出现问题怎么办 三星手机下载解析包出现问题怎么办 两万的流动大棚给整坏了怎么办 劲舞团抽奖领了一样的衣服怎么办 win系统ps界面字体太小怎么办 任何网页都变成监控登录界面怎么办 微信启动录音的尝试被拒绝怎么办 微信传到电脑的文件打不开怎么办 转转网账号出租时遇到防沉迷怎么办 如果买了王者号结果有防沉迷怎么办 苹果手机一直显示验证失败怎么办呢 安装包证书异常导致安装失败怎么办 qq飞车忘了几区的怎么办 5e在游戏里卡住不动怎么办 别人发的cdr文件打开太慢怎么办 qq红包充值话费未到账怎么办 qq飞车充值至尊皇冠不到账怎么办 微信支付金额超过单日限制怎么办 不小心在qq钱包中充错话费怎么办 衣服质量不好穿了几次就坏了怎么办 手机丢了找到手机店的人怎么办 在手机店买手机买贵了怎么办 王者荣耀好多没对的东西怎么办 用电脑玩游戏键盘不管用怎么办?