Android课堂笔记—SQLite3和ContentProvider

来源:互联网 发布:软件设计师报名入口 编辑:程序博客网 时间:2024/06/05 06:16


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 );


属性(数据类型):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);


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;


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()方法创建表

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;@Overridepublic boolean onCreate() {    sqLiteHelper=new MySQLiteHelper(getContext());    return false;}@Nullable@Overridepublic 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@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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;}






0 0
原创粉丝点击