Android课堂笔记—SQLite3和ContentProvider


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需要使用的URIURL
    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;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值