Android课堂笔记—SQLite3和ContentProvider
2016-08-21 15:51
369 查看
SQLite3
SQLite3是一个轻量级的数据库,Android中已经内置
接下来我们通过命令行来学习SQLite3的命令,之后在Android中使用会更容易理解
注:以下命令均在linux下yu
1.创建数据库
在命令行中创建数据库
sqlite3 test.db
2.创建表
关键词CREATE TABLE,后面接表名,表名后面的括号内声明表的列名以其属性和约束
CREATE TABLE table_name(column_name1 INTEGER NOT NULL,column_name2 TEXT CHAR(50),column_name3 REAL );
#新建表student,表中有三列id,name,grade
sqlite> CREATE TABLE student(id INTEGER PRIMARY KEY NOT NULL,
...> name TEXT NOT NULL,
...> grade REAL );
属性(数据类型):INTEGER,TEXT,REAL,BLOB
约束:NOT NULL, DEFAULT, UNIQUE, PRIMARY KEY,CHECK
3.删除表
DROP TABLE table_name;
4.插入语句
INSERT INTO table_name(column_name1,column_name2,column_name3) VALUES(value1,value2,value3);
#插入三条数据
sqlite> INSERT INTO student(id,name,grade) VALUES(1,'jack',100);
sqlite> INSERT INTO student(id,name,grade) VALUES(2,'dave',99);
sqlite> INSERT INTO student(id,name,grade) VALUES(3,'chris',99);
table_name后面跟的是需要插入数据的列名,当每一列都需要插入时可以省略
VALUES 每一列对应的值
5.获取数据
SELECT column_name1, column_name2, column_name3 FROM table_name;
获取表的所有内容:SELECT × FROM table_name;
6.WHERE子句
用于SELECT语句时,限定输出内容
SELECT column_name1, column_name2, column_name3 FROM table_name WHERE column_name1>10;
#将输出结果限定为grade=99
sqlite> SELECT * FROM student WHERE grade=99;
id name grade
---------- ---------- ----------
2 dave 99.0
3 chris 99.0
WHERE后面可以跟比较运算符和逻辑运算符,用AND 或OR可以在WHERE后面使用多个条件
7.更新数据
UPDATE table_name SET column_name1=value1,column_name2=value2 WHERE column_name1=1;
当没有WHERE限定时每一行的数据都会更新
8.删除数据
DELETE FROM table_name WHERE column_name1=1;
当没有WHERE限定时会删除所有数据,但是不会删除表
9. ORDER BY
SELECT * FROM table_name ORDER BY column_name2 ASC;
ASC 升序,DESC降序
10.命令行相关命令
以下是在命令提示符下的sqlite命令,在命令行下练习时很实用
.quit .exit退出命令行
.databases 查询当前数据库
.show 查看设置
.header 设置显示列名
.mode 设置显示模式/column/list
.tables查看当前的所有表
.schema 表名 查看表中的信息
ContentProvider用法
1.创建数据库
继承SQLiteOpenHelper类,重写OnCreate()方法创建表
2.创建一个类用来表示数据库的表名、列名以及使用ContentProvider时需要使用的URL
3.创建类继承ContentProvider类,并重写一些方法
静态语句块UriMatcher用来匹配URL
重写onCreate()方法新建MySQLiteHelper,query()查询数据库并通知Cursor更新
重写insert(),update()以及delete()方法
在manifest中注册ContentProvider
4.使用ContentProvider
添加数据
查询数据库并从Cursor中得到数据
SQLite3是一个轻量级的数据库,Android中已经内置
接下来我们通过命令行来学习SQLite3的命令,之后在Android中使用会更容易理解
注:以下命令均在linux下yu
1.创建数据库
在命令行中创建数据库
sqlite3 test.db
#新建test.db数据库 chao@chao-TOP2:~/sql$ sqlite3 test.db SQLite version 3.11.0 2016-02-15 17:29:24 Enter ".help" for usage hints. #查看数据库 sqlite> .database seq name file --- --------------- ---------------------------------------------------------- 0 main /home/chao/sql/test.db
2.创建表
关键词CREATE TABLE,后面接表名,表名后面的括号内声明表的列名以其属性和约束
CREATE TABLE table_name(column_name1 INTEGER NOT NULL,column_name2 TEXT CHAR(50),column_name3 REAL );
#新建表student,表中有三列id,name,grade
sqlite> CREATE TABLE student(id INTEGER PRIMARY KEY NOT NULL,
...> name TEXT NOT NULL,
...> grade REAL );
属性(数据类型):INTEGER,TEXT,REAL,BLOB
约束:NOT NULL, DEFAULT, UNIQUE, PRIMARY KEY,CHECK
3.删除表
DROP TABLE table_name;
4.插入语句
INSERT INTO table_name(column_name1,column_name2,column_name3) VALUES(value1,value2,value3);
#插入三条数据
sqlite> INSERT INTO student(id,name,grade) VALUES(1,'jack',100);
sqlite> INSERT INTO student(id,name,grade) VALUES(2,'dave',99);
sqlite> INSERT INTO student(id,name,grade) VALUES(3,'chris',99);
table_name后面跟的是需要插入数据的列名,当每一列都需要插入时可以省略
VALUES 每一列对应的值
5.获取数据
#查看student表中所有的数据 sqlite> SELECT * FROM student; id name grade ---------- ---------- ---------- 1 jack 100.0 2 dave 99.0 3 chris 99.0 #查看student表中name,grade列的所有数据 sqlite> SELECT name,grade FROM student; name grade ---------- ---------- jack 100.0 dave 99.0 chris 99.0 sqlite>
SELECT column_name1, column_name2, column_name3 FROM table_name;
获取表的所有内容:SELECT × FROM table_name;
6.WHERE子句
用于SELECT语句时,限定输出内容
SELECT column_name1, column_name2, column_name3 FROM table_name WHERE column_name1>10;
#将输出结果限定为grade=99
sqlite> SELECT * FROM student WHERE grade=99;
id name grade
---------- ---------- ----------
2 dave 99.0
3 chris 99.0
WHERE后面可以跟比较运算符和逻辑运算符,用AND 或OR可以在WHERE后面使用多个条件
7.更新数据
UPDATE table_name SET column_name1=value1,column_name2=value2 WHERE column_name1=1;
#将dave的grade改为80 sqlite> UPDATE student SET grade=80 WHERE name='dave'; #查看修改结果 sqlite> SELECT * FROM student; id name grade ---------- ---------- ---------- 1 jack 100.0 2 dave 80.0 3 chris 99.0
当没有WHERE限定时每一行的数据都会更新
8.删除数据
DELETE FROM table_name WHERE column_name1=1;
#删除chris这一行的所有数据 sqlite> DELETE FROM student WHERE name='chris'; #查看结果 sqlite> SELECT * FROM student; id name grade ---------- ---------- ---------- 1 jack 100.0 2 dave 80.0
当没有WHERE限定时会删除所有数据,但是不会删除表
9. ORDER BY
SELECT * FROM table_name ORDER BY column_name2 ASC;
#插入两条数据 sqlite> INSERT INTO student VALUES(3,'alan',30); sqlite> INSERT INTO student VALUES(4,'denny',50); #按grade升序排列 sqlite> SELECT * FROM student ORDER BY grade ASC; id name grade ---------- ---------- ---------- 3 alan 30.0 4 denny 50.0 2 dave 80.0 1 jack 100.0 sqlite>
ASC 升序,DESC降序
10.命令行相关命令
以下是在命令提示符下的sqlite命令,在命令行下练习时很实用
.quit .exit退出命令行
.databases 查询当前数据库
.show 查看设置
.header 设置显示列名
.mode 设置显示模式/column/list
.tables查看当前的所有表
.schema 表名 查看表中的信息
ContentProvider用法
1.创建数据库
继承SQLiteOpenHelper类,重写OnCreate()方法创建表
public class MySQLiteHelper extends SQLiteOpenHelper { private static String DATABASE_NAME="user.db"; public MySQLiteHelper(Context context) { //DATABASE_NAME是数据库名,创建以此为名的数据库 //null表示使用默认的Cursor super(context, DATABASE_NAME, null, 1); } @Override public void onCreate(SQLiteDatabase db) { //创建数据库表 db.execSQL("CREATE TABLE "+ UserInfo.USER_TABLE+"(" +UserInfo.USER_ID+" INTEGER PRIMARY KEY," +UserInfo.USER_NAME+" TEXT UNIQUE NOT NULL," +UserInfo.USER_PASSWORD+" TEXT NOT NULL" +");"); }
2.创建一个类用来表示数据库的表名、列名以及使用ContentProvider时需要使用的URL
public class UserInfo { //数据库的表名 public static final String USER_TABLE = "user"; //表的三个列名 public static final String USER_ID = "id"; public static final String USER_NAME = "name"; public static final String USER_PASSWORD = "password"; //使用ContentProvider时需要使用的URI、URL public static final String AUTHORITIES = "com.example.chao.provider"; public static final String SCHEME = "content://"; public static final String USER_URL = SCHEME + AUTHORITIES + "/" + USER_TABLE; public static final Uri USER_URI = Uri.parse(USER_URL); }
3.创建类继承ContentProvider类,并重写一些方法
静态语句块UriMatcher用来匹配URL
static { sUriMatcher=new UriMatcher(UriMatcher.NO_MATCH); sUriMatcher.addURI(UserInfo.AUTHORITIES,UserInfo.USER_TABLE,TABLE); sUriMatcher.addURI(UserInfo.AUTHORITIES,UserInfo.USER_TABLE+"/#",ID); }
重写onCreate()方法新建MySQLiteHelper,query()查询数据库并通知Cursor更新
public SQLiteDatabase db; @Override public boolean onCreate() { sqLiteHelper=new MySQLiteHelper(getContext()); return false; } @Nullable @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { db = sqLiteHelper.getWritableDatabase(); //用来匹配url返回相应的约束where String where=getWhere(uri,selection); Cursor cursor=db.query(UserInfo.USER_TABLE,projection,where,selectionArgs,null,null,sortOrder); try { cursor.setNotificationUri(getContext().getContentResolver(),uri); }catch (NullPointerException e){ e.printStackTrace(); } return cursor;
重写insert(),update()以及delete()方法
@Nullable @Override public Uri insert(Uri uri, ContentValues values) { db=sqLiteHelper.getWritableDatabase(); if(sUriMatcher.match(uri)!=TABLE){ throw new IllegalArgumentException("unknown uri"+uri); } long id=db.insert(UserInfo.USER_TABLE,null,values); if(id<0){ return null; } Uri u=ContentUris.withAppendedId(uri,id); getContext().getContentResolver().notifyChange(u,null); return u; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { db=sqLiteHelper.getWritableDatabase(); int number=0; String where = getWhere(uri, selection); number=db.delete(UserInfo.USER_TABLE,where,selectionArgs); getContext().getContentResolver().notifyChange(uri,null); return number; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { db=sqLiteHelper.getWritableDatabase(); int number; String where=getWhere(uri,selection); number=db.update(UserInfo.USER_TABLE,values,where,selectionArgs); getContext().getContentResolver().notifyChange(uri,null); return number; }
在manifest中注册ContentProvider
<provider android:authorities="com.example.chao.provider" android:name=".provider.UserInfoProvider"> </provider>
4.使用ContentProvider
添加数据
ContentResolver contentResolver = getActivity().getContentResolver(); ContentValues values = new ContentValues(); values.put(UserInfo.USER_NAME, name); values.put(UserInfo.USER_PASSWORD, password); Uri uri = contentResolver.insert(UserInfo.USER_URI, values);
查询数据库并从Cursor中得到数据
public String queryUser(String name){ ContentResolver contentResolver=getActivity().getContentResolver(); String[] whereArg={name}; String password=""; //查询数据库 Cursor cursor=contentResolver.query(UserInfo.USER_URI,null, UserInfo.USER_NAME+"=?",whereArg,null); //得到cursor中的数据 if(cursor!=null){ if(cursor.moveToFirst()){ password=cursor.getString(cursor.getColumnIndex(UserInfo.USER_PASSWORD)); Log.d(TAG,"PASSWORD: "+password); } cursor.close(); }else{ password=null; } return password; }
相关文章推荐
- Android深入探究笔记之十 -- 使用 ContentProvider 共享数据(二),访问与添加通讯录
- Android深入探究笔记之十 -- 使用 ContentProvider 共享数据(二),访问与添加通讯录
- [Android课堂笔记] 2D Graphic图形绘制全解析
- Android(java)学习笔记246:ContentProvider使用之学习ContentProvider(内容提供者)的目的
- Android(java)学习笔记245:ContentProvider使用(银行数据库创建和增删改查的案例)
- android 数据库 SQLiteOpenHelper和ContentProvider学习笔记---添加数据及显示(一)
- Android(java)学习笔记250:ContentProvider使用之获得系统联系人信息02(掌握)
- android菜鸟学习笔记22----ContentProvider(二)ContentObserver的简单使用
- android菜鸟学习笔记21----ContentProvider(一)ContentProvider的简单使用
- Android(java)学习笔记248:ContentProvider使用之虚拟短信
- Android应用开发学习笔记之ContentProvider
- android基础笔记:内容提供者及访问(ContentProvider、ContentResolver)
- Android自学笔记-12-ContentProvider简单例子
- android菜鸟学习笔记23----ContentProvider(三)利用内置ContentProvider监听短信及查看联系人
- Android笔记使用ContentResolver操作ContentProvider中的数据
- Android 面试题笔记-------ContentProvider实现数据共享的方式
- Android入门学习笔记(二) SQLite数据库|ContentProvider|从Internet读取数据
- Android 复习笔记之图解ContentProvider实现数据共享
- Android笔记_ContentProvider
- Android(java)学习笔记249:ContentProvider使用之获得系统联系人信息01