android SQLite (一)基本操作

最近为了巩固android基础,复习了sqlite数据库这篇。好记性不如烂笔头,操起键盘就是干....

sqlite简介

SQLite 是一款轻量级的关系型数据库,它的运算速度非常快, 占用资源很少,通常只需要几百 K 的内存就足够了,因而特别适合在移动设备上使用。SQLite 不仅支持标准的 SQL 语法,还遵循了数据库的 ACID 事务,所以只要你以前使用过其他的 关系型数据库,就可以很快地上手 SQLite。而 SQLite 又比一般的数据库要简单得多,它甚 至不用设置用户名和密码就可以使用。Android 正是把这个功能极为强大的数据库嵌入到了 系统当中,使得本地持久化的功能有了一次质的飞跃。

优点:

1)零配置,无需安装和配置
2)储存在单一磁盘文件中的一个完整数据库
3)数据库文件可以在不同的字节顺序的机器间自由共享
4)支持数据库大小至2TB
5)足够小,全部源代码大致3万行C代码,250k
6)比目前流行的大多数数据库带数据的操作要快
7)开源

常用的sql基本语句

创建表:
create table  表名 (字段名 数据类型,字段名 数据类型,字段名 数据类型)
插入数据:
insert into 表名 values(数据值,数据值,数据值)
insert into 表名 (字段1,字段2,字段3) values(数据值,数据值,数据值)
更新数据:
update 表名 set 字段1 = 数据值 where 其他字段 = 数据值
删除数据:
delete from 表名 where  字段值 = 数据值
删除表:
drop table if exists 表名
增加字段:
alter table 表名 add column 字段  数据类型
查询数据:
select * from表名 where 查询的条件表达式  group by 分组的字段 order by 排序的字段 
 //select 后面为* 则返回所有的字段,返回部分字段,只需把*换成需要的字段,多个字段有逗号隔开

创建数据库

android的为我们提供了SQLiteOpenHelper ,继承这个抽象类类,需要复写构造方法(一般选构造参数少的那个),onCreate()和onUpgrade()

onCreate

这个方法是用来创建数据库用的;

onUpgrade

这个方法是用来升级数据库用的;

例子如下:

创建一个学生表

public class MySQLiteHelp extends SQLiteOpenHelper {
    public static final int VERSION = 1;
    private static final String DB_NAME = "my_db.db";
    private static final String CREATE_BOOK = "create table Students (" +
            "id integer primary key autoincrement," +
            "name text," +
            "class text," +
            "year integer," +
            "grade real)";
    private Context mContext;

    public MySQLiteHelp(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        this.mContext = context;
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL(CREATE_BOOK);
        Toast.makeText(mContext,"创建成功!",Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
}

然后实例化MySQLiteHelp这个类,并调用getWritableDatabase()方法。

//第一个参数上下文,第二个参数数据库名字,第三个参数允许我们在查询数据的时候返回一个自定义的Cursor,一般传null,第四个参数传入数据库版本
mySQLiteHelp = new MySQLiteHelp(this,MySQLiteHelp.DB_NAME,null,1);
//创建或者打开一个数据库,如果数据库存在就打开,没有就创建
mySQLiteHelp.getWritableDatabase();

打开File Explorer查看数据库是否创建成功;目录在data/data/[包名]/databases


image.png

这里需要讲下 SQLite的数据类型和getWritableDatabase()与getReadableDatabase()的区别

SQLite的数据类型只有5种:

1,null(数据值为空)
2,integer(整型)
3,real(浮点型数据)
4,text(字符串,数据库编码【utf-8,utf-16be或者utf-16le】存放)
5,blob(只是一个数据块,完全按照输入存放)

getWritableDatabase()与getReadableDatabase()的区别

getWritableDatabase取得的实例不是仅仅具有写的功能,而是同时具有读和写的功能同样的;

getReadableDatabase取得的实例也是具对数据库进行读和写的功能。

两者的区别在于getWritableDatabase取得的实例是以读写的方式打开数据库,如果打开的数据库磁盘满了,此时只能读不能写,此时调用了getWritableDatabase的实例,那么将会发生错误(异常)

getReadableDatabase取得的实例是先调用getWritableDatabase以读写的方式打开数据库,如果数据库的磁盘满了,此时返回打开失败,继而用getReadableDatabase的实例以只读的方式去打开数据库

操作数据库

操作数据库的类不是SQLiteOpenHelper ,而是SQLiteDatabase,这个对象是通过调用getWritableDatabase方法返回的对象;
下面来演示下操作数据库的增删改查

添加数据

ps:db 是一个SQLiteDatabase对象;
调用db.execSQL(String sql)方法;

 String sql = "insert into Students (name,class,year,grade) values ('小明','一年级',8,98)";
 db.execSQL(sql);

这里我用sqlite expert professional 这个工具打开数据库,查看数据是否插入成功

image.png

其实SQLiteDatabase还为我们提供了更加简单的一种方法插入数据;
调用 db.insert();

  ContentValues values = new ContentValues();
                values.put("name","小红");
                values.put("class","一年级");
                values.put("year",7);
                values.put("grade",100);
                db.insert("Students",null,values);
image.png

更新数据

我们来将小明的分数偷偷的改成100

使用sql语法的如下:
String sql = "update Students set grade = 100 where name = '小明' ";
                db.execSQL(sql);
android内置语法:

我们来把小明的分数偷偷的改成60

    ContentValues values1 = new ContentValues();
                values1.put("grade",60);
                db.update("Students",values1,"name = ?",new String[]{"小明"});

db.update的方法需要传入四个参数,第一个是表名,第二个是需要修改的值,第三个是条件,第四个是符合条件的值


image.png

删除数据

我们来将小明的数据删除点;

sql语法:
 String sql = "delete from Students where name = '小明' ";
 db.execSQL(sql);

将小明的数据删除了,这样他爸妈就不知道了。


image.png
android内置语法:
//这里三个参数,第一个是表名,第二个是条件,第三个是符合条件的值
db.delete("Students","name = ?",new String[]{"小明"});

查询数据

sql语句:

查询数据这里不能用:db.execSQL(sql),
这里需要换一个方法:db.rawQuery()

String sql1 = "select * from Students where name = '小红' ";
                //第一个参数为select语句;第二个参数为select语句中占位符参数的值,如果select语句没有使用占位符,该参数可以设置为null
                Cursor cursor = db.rawQuery(sql1, null);
                if (cursor.moveToFirst()){
                    do {
                        String name = cursor.getString(cursor.getColumnIndex("name"));
                        String class_ = cursor.getString(cursor.getColumnIndex("class"));
                        int year = cursor.getInt(cursor.getColumnIndex("year"));
                        double grade = cursor.getDouble(cursor.getColumnIndex("grade"));
                        Log.d(TAG, "name: "+name);
                        Log.d(TAG, "name: "+class_);
                        Log.d(TAG, "name: "+year);
                        Log.d(TAG, "name: "+grade);
                    }while (cursor.moveToNext());

                }
                cursor.close();

执行完查询语句返回一个Cursor数据类型。他是一个提供了随机读写访问数据库查询结果集的接口。Cursor并不是线程安全,因此在多线程中访问的时候需要手动进行同步,避免线程出现问题。
常用的Cursor函数有:
close() 关闭游标,释放资源
copyStringToBuffer(int columnIndex, CharArrayBuffer buffer) 在缓冲区中检索请求的列的文本,将将其存储
getColumnCount() 返回所有列的总数
getColumnIndex(String columnName) 返回指定列的名称,如果不存在返回-1
getColumnIndexOrThrow(String columnName) 从零开始返回指定列名称,如果不存在将抛出IllegalArgumentException 异常。
getColumnName(int columnIndex) 从给定的索引返回列名
getColumnNames() 返回一个字符串数组的列名
getCount() 返回Cursor 中的行数
moveToFirst() 移动光标到第一行
moveToLast() 移动光标到最后一行
moveToNext() 移动光标到下一行
moveToPosition(int position) 移动光标到一个绝对的位置
moveToPrevious() 移动光标到上一行

android内置语法:
/**
     * 第一个参数:表名
     * 第二个参数:要查询的字段名
     * 第三个参数:要查询的条件字段
     * 第四个参数:要查询的条件字段对应的值
     * 第五个参数:分组的字段
     * 第六个参数:筛选的字段
     * 第七个参数:排序的字段
     * 返回值:游标
      Cursor cursor = db.query("Students",null,null,null,null,null,null);
     */

获取了游标Cursor 之后的操作与上面一样。
android的基本操作就这样了,下次有时候写一下数据库的升级和优化部分。等我把github弄好我再吧代码上传

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,259评论 25 707
  • 在 SQL 数据库中保存数据 使用数据库将数据保存到数据库对于重复或结构化数据(比如契约信息)而言是理想之选。 本...
    牧童遥指2000阅读 637评论 2 2
  • 简介:SQLite是轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。此外它还是开...
    当幸福来敲门58阅读 2,100评论 0 1
  • 我很想你。 现在是2017年6月5日08:39分。 铃声响起,这个时间有的同学们依旧趴在桌面闭目养神。大屏幕播放着...
    瘦十斤斤阅读 104评论 1 0
  • 文 | 壹百 阿城《棋王》可这象棋,始终是处在一种机敏的运动之中,兜捕对手,逼向死角,不能疏忽。 汇道禅于一炉,神...
    填clipaul阅读 630评论 0 2