您的位置:首页 > 数据库 > SQL

Android课堂笔记—SQLite3和ContentProvider

2016-08-21 15:51 369 查看
SQLite3

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐