Android攻城狮的第二门课(第3季)第2章 数据存储之SQLite
来源:互联网 发布:农业物联网大数据平台 编辑:程序博客网 时间:2024/05/12 10:36
本章讲解在Android使用嵌入式数据库SQLite存储数据,怎么样使用简单的sql语句来实现数据的增加,删除,修改和查询,以及怎样使用游标来实现数据的增加,修改,删除和查询操作。
1。支持高达2TB大小的数据库
2。以单个文件的形式存储
3。以B-tree的数据结构形式存储在磁盘
特点:
1。轻量级 一个动态库 单文件
2。独立性 没有依赖(第三方),无序安装
3。隔离性 全部在一个文件夹中
4。 跨平台 支持多操作系统
5。多语言接口 支持众多编程语言
6。安全性 事务
通过数据库上的独占性和共享锁来实现独立事务处理
多个进程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据
数据类型:
空值,整型值,浮点值,字符串值,二进制对象。
动态数据类型(弱引用)
SQLite会检查与其关联的类型。
没有可用于SQLite的网络服务、只能通过网络共享可能存在文件锁定或者性能问题。
使用SQLite
(1)SQLiteDatabase
管理SQLite的类,如创建,删除。。
每个程序的数据库的名是唯一的。
(2)SQLiteOpenHelper
如何打开DDMS进行数据data文件的查看:
https://jingyan.baidu.com/article/75ab0bcbccbc21d6864db28f.html
adb shell su -c “chomd 777 /data/data”
直接在CDM下输入就可以了
用 navicat 查看数据库
package com.imooc.li806.sqlitedemo1;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //每个程序都有自己的数据库 默认情况下是各自互相不干扰 //创建一个数据库 并且打开 //openOrCreateDatabase("user.db", MODE_PRIVATE, null); /* *SQLiteDatabase db 数据量对象 *user.db 数据库名 *MODE_PRIVATE(私有) 权限 *游标 * */ SQLiteDatabase db = openOrCreateDatabase("user.db", MODE_PRIVATE, null); //执行SQl语句。 //建表 db.execSQL("create table if not exists usertb " + "(_id integer primary key autoincrement," + " name text not null , " + "age integer not null , " + "sex text not null )"); db.execSQL("insert into usertb(name,sex,age) values('张三','女',18)"); //插入数据 db.execSQL("insert into usertb(name,sex,age) values('李四','女',19)"); db.execSQL("insert into usertb(name,sex,age) values('王五','男',20)"); //查询语句 查询条件 Cursor c = db.rawQuery("select * from usertb", null); /* * Cursor是Android查询数据后得到的一个管理数据集合的类, * 由虚拟机保证数据的释放。 * c 游标 * */ if (c!=null) { //c.moveToNext()移动到下一条 每次查一条 while (c.moveToNext()) { //c.getColumnIndex("_id") 取出第一个字段 == c.getColumnIndex(0) Log.i("info", "_id:"+c.getInt(c.getColumnIndex("_id"))); Log.i("info", "name:"+c.getString(c.getColumnIndex("name"))); Log.i("info", "age:"+c.getInt(c.getColumnIndex("age"))); Log.i("info", "sex:"+c.getString(c.getColumnIndex("sex"))); Log.i("info", "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); } //游标的释放 c.close(); } //数据对象释放 db.close(); }}
不建议直接执行SQL语句,建议用它提供的专门方法写程序
package com.imooc.li806.sqlitedemo2;import android.content.ContentValues;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //创建数据库 SQLiteDatabase db = openOrCreateDatabase("stu.db", MODE_PRIVATE, null); db.execSQL( "create table if not exists stutb(_id integer primary key autoincrement,name text not null,sex text not null,age integer not null)" ); //primary key 主键 autoincrement 自增 ContentValues values = new ContentValues(); values.put("name", "张三"); values.put("sex", "男"); values.put("age", 19); //"stutb" 数据库名 values 插入的值 hashmap键值对 long rowId = db.insert("stutb", null, values); //行的ID values.clear();//把上次的数据清空掉,这样就不用 new ContentValues(); values.put("name", "张三丰"); values.put("sex", "男"); values.put("age", 99); db.insert("stutb", null, values);//执行插入 values.clear(); values.put("name", "张三疯"); values.put("sex", "男"); values.put("age", 59); db.insert("stutb", null, values); values.clear(); values.put("name", "张三峰"); values.put("sex", "男"); values.put("age", 39); db.insert("stutb", null, values); values.clear(); values.put("name", "张三封"); values.put("sex", "男"); values.put("age", 29); db.insert("stutb", null, values); values.clear(); values.put("sex", "女"); db.update("stutb", values, "_id>?", new String[]{"3"}); //将全部id>3的人的性别改成女 db.delete("stutb", "name like ?", new String[]{"%丰%"}); //删除所有名字中带有丰的人 //查询所有id大于0的数据 也就是全部查询 //游标对象 Cursor c = db.query("stutb", null, "_id>?", new String[]{"0"}, null, null, "name"); if (c!=null) { String [] columns= c.getColumnNames(); //返回列表名 id,name,age等等... System.out.println(columns); while (c.moveToNext()) {//循环 for (String columnName : columns) { Log.i("info", c.getString(c.getColumnIndex(columnName))); } } c.close(); } db.close(); }}
SQLiteOpenHelper
SQLiteDatabase的帮助类,用于管理数据库的创建和版本的更新。
package com.imooc.li806.sqlitedemo3;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;/** * Created by li806 on 2017/8/24. */public class DBOpenHelper extends SQLiteOpenHelper { //构造函数可以多个。 version 版本号 public DBOpenHelper(Context context, String name) { super(context, name, null, 1); // TODO Auto-generated constructor stub } public DBOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); } //这两个方法不会人为的调用。 @Override //首次创建数据库的时候调用 一般可以把建库 建表的操作 public void onCreate(SQLiteDatabase db) { db.execSQL("create table if not exists stutb(_id integer primary key autoincrement,name text not null,sex text not null,age integer not null)"); db.execSQL("insert into stutb(name,sex,age)values('张三','女',18)"); } @Override //当数据库的版本发生变化的时候 会自动执行 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }}
package com.imooc.li806.sqlitedemo3;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //建立数据库 DBOpenHelper helper = new DBOpenHelper(MainActivity.this, "stu.db");// helper.getReadableDatabase();// 获取一个只读的数据库 只能查询 不能写入 不能更新 SQLiteDatabase db = helper.getWritableDatabase(); //查询// db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy) //"select * from stutb" 查询条件 Cursor游标对象 Cursor c = db.rawQuery("select * from stutb", null); if (c!=null) { String [] cols = c.getColumnNames(); while (c.moveToNext()) { for (String ColumnName : cols) { Log.i("info", ColumnName+":"+c.getString(c.getColumnIndex(ColumnName))); } } c.close(); } db.close(); }}
- Android攻城狮的第二门课(第3季)第2章 数据存储之SQLite
- Android攻城狮的第二门课(第3季)第3章 数据存储之文件存储
- Android攻城狮的第二门课(第3季)第1章 数据存储之SharedPreferences
- Android攻城狮的第二门课(第3季)第4章 四大组件之ContentProvider
- Android攻城狮的第二门课(第3季)第5章 四大组件之BroadcastReceiver
- Android攻城狮的第二门课(第1季)第2章 使用ListView显示信息列表
- Android攻城狮的第二门课(第2季)第4章 使用AlertDialog实现提示框
- Android攻城狮的第二门课(第1季)第1章 解读AndroidManifest配置文件
- Android攻城狮的第二门课(第1季)第8章 Fragment基础概述
- 数据存储之SQLite 数据库存储——第一行代码Android学习笔记
- 虚指针的对齐_boolan_第二门课_第一周_作业
- JAVA 攻城狮 第一天
- JAVA 攻城狮 第三天
- JAVA 攻城狮 第五天
- JAVA 攻城狮 第七天
- JAVA 攻城狮 第八天
- JAVA 攻城狮 第九天
- JAVA 攻城狮 第十四天
- navicat中的mysql创建外键
- ECO: Efficient Convolution Operators for Tracking视频目标跟踪论文笔记(PPT版)
- 操作系统思维导图
- java.util.concurrent.CountDownLatch 的使用案例
- "?:"在正则表达式中什么意思
- Android攻城狮的第二门课(第3季)第2章 数据存储之SQLite
- rapidjson简单使用
- fzu-2266
- 精通MongoDB-索引与查询优化
- tensorflow运维(3):tensorflow1.0的一个bug:can't open CUDA library libcupti.so.8.0
- Tomcat8.5源码分析-ContextConfig
- php中curl模拟post提交多维数组
- 对话框
- web测试方法总结(二)