作业——在线学习Android课程之第六周

本文详细介绍SQLite数据库的基础使用方法,包括创建数据库、添加、更新、删除和查询数据等基本操作,并通过示例代码进行说明。此外,还介绍了ContentProvider组件及其在Android系统中的应用。

第一节 用SQLite存储你重要的数据

1、简介

SQL是轻量级的关系型数据库,它的运算速度非常快,占用资源很少。是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎。它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行。

SQLite由以下几个部分组成:SQL编译器、内核、后端以及附件。SQLite通过利用虚拟机和虚拟数据库引擎(VDBE),是调试、修改和扩展SQLite的内核变得更加方便。所有SQL语句都被编译成易读的、可以在SQLite虚拟机中执行的程序集。

2、支持字段类型

VARCHAR(10),NVARCHAR(15),TEXT,INTEGER,FLOAT,BOOLEAN,CLOB,BLOB,TIMESTAMP,NUMERIC(10,5),VARYING CHARACTER (24),NATIONAL VARYING CHARACTER(16)。

3、创建数据库

//SQLiteOpenHelper可以帮助我们更方便地管理数据库,但其是抽象类,需继承重写。

public class MyDatabaseHelper extends SQLiteOpenHelper {
    public static final String CREATE_USER_INFO = "create table UserInfo ("
            + "id integer primary key autoincrement, "
            + "user_name text, "
            + "user_password text, "
            + "logon boolean)";
    public static final String CREATE_LOGIN_HISTORY = "create table LoginHistory ("
            + "id integer primary key autoincrement, "
            + "user_name text, "
            + "login_time text)";

    public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        //参数分别为Context、数据库名、允许返回自定义的Cursor,一般传入null、版本号(与onUpgrade方法有关)
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_USER_INFO);
        db.execSQL(CREATE_LOGIN_HISTORY);
        //示例中创建了两个表
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }
}

4、添加数据

MyDatabaseHelper mDBHelper = new MyDatabaseHelper(this, "LoginInfo.db", null, 1);
SQLiteDatabase db = mDBHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("user_name", userName);
values.put("user_password", password);
values.put("logon", true);

db.insert("UserInfo", null, values);
//参数分别为:表名、未指定添加数据时给某些可为空的列自动赋值NULL、ContentValues对象

5、更新数据

MyDatabaseHelper mDBHelper = new MyDatabaseHelper(this, "LoginInfo.db", null, 1);
SQLiteDatabase db = mDBHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("logon", true);

db.update("UserInfo", values, "user_name = ?", new String[]{userName});
//参数为:表名;ContentValues对象;三、四参数用于约束更新某一行或多行的条件。

6、删除数据

db.delete("LoginHistory", "user_name = ?", new String[]{userName});

6、查询数据

SQLiteDatabase db = mDBHelper.getWritableDatabase();
Cursor cursor = db.query("LoginHistory", null, null, null, null, null, null);
if (cursor.moveToFirst()){
    mHistoryDatas.clear();
    UserLoginHistoryData historyData;
    do {
        String userName = cursor.getString(cursor.getColumnIndex("user_name"));
        String loginDate = cursor.getString(cursor.getColumnIndex("login_time"));
        historyData = new UserLoginHistoryData(userName, loginDate);
        mHistoryDatas.add(historyData);
    } while (cursor.moveToNext());
}
cursor.close();

db.query的参数:
table              指定查询的表名
columns            指定查询的列名
selection          指定where的约束条件
selectionArgs      为where中的占位符“?”提供具体的值
groupBy            指定需要group by的列
having             对group by后的结果进一步约束
orderBy            指定查询结果的排序方式

第二节 系统源码也经常用的ContentProvider

1、简介

ContentProvider:为存储和获取数据提供统一的接口。可以在不同的应用程序之间共享数据。Android已经为常见的一些数据提供了默认的ContentProvider

2、提供的方法

query:查询

   insert:插入
   update:更新
   delete:删除
   getType:得到数据类型
   onCreate:创建数据时调用的回调函数

3、示例

public class MyContentProvider extends ContentProvider {
    //访问表的所有列
   public static final int INCOMING_USER_COLLECTION = 1;
   //访问单独的列
   public static final int INCOMING_USER_SINGLE = 2;
   //操作URI的类
   public static final UriMatcher uriMatcher;
   //为UriMatcher添加自定义的URI
   static{
       uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
       uriMatcher.addURI(MyContentProviderMetaData.AUTHORITIES,"/user",INCOMING_USER_COLLECTION);
        uriMatcher.addURI(MyContentProviderMetaData.AUTHORITIES,"/user/#",INCOMING_USER_SINGLE);
   }
   private DatabaseHelp dh;
   //为数据库表字段起别名
   public static HashMap userProjectionMap;
   static
   {
       userProjectionMap = new HashMap();
       userProjectionMap.put(UserTableMetaData._ID,UserTableMetaData._ID);
       userProjectionMap.put(UserTableMetaData.USER_NAME, UserTableMetaData.USER_NAME);
   }
   /**
   * 删除表数据
   */
   @Override
   public int delete(Uri uri, String selection, String[] selectionArgs) {
       System.out.println("delete");
       //得到一个可写的数据库
       SQLiteDatabase db = dh.getWritableDatabase();
       //执行删除,得到删除的行数
       int count = db.delete(UserTableMetaData.TABLE_NAME, selection, selectionArgs);
       return count;
   }
   /**
   * 数据库访问类型
   */
   @Override
   public String getType(Uri uri) {
       System.out.println("getType");
       //根据用户请求,得到数据类型
       switch (uriMatcher.match(uri)) {
           case INCOMING_USER_COLLECTION:
           return MyContentProviderMetaData.UserTableMetaData.CONTENT_TYPE;
           case INCOMING_USER_SINGLE:
           return MyContentProviderMetaData.UserTableMetaData.CONTENT_TYPE_ITEM;
           default:
           throw new IllegalArgumentException("UnKnown URI"+uri);
       }
   }
   /**
   * 插入数据
   */
   @Override
   public Uri insert(Uri uri, ContentValues values) {
       //得到一个可写的数据库
       SQLiteDatabase db = dh.getWritableDatabase();
       //向指定的表插入数据,得到返回的Id
       long rowId = db.insert(UserTableMetaData.TABLE_NAME, null, values);
       if(rowId > 0){//判断插入是否执行成功
           //如果添加成功,利用新添加的Id和
           Uri insertedUserUri = ContentUris.withAppendedId(UserTableMetaData.CONTENT_URI, rowId);
           //通知监听器,数据已经改变
           getContext().getContentResolver().notifyChange(insertedUserUri, null);
           return insertedUserUri;
        }
       return uri;
   }
   /**
   * 创建ContentProvider时调用的回调函数
   */
   @Override
   public boolean onCreate() {
       System.out.println("onCreate");
       //得到数据库帮助类
       dh = new DatabaseHelp(getContext(),MyContentProviderMetaData.DATABASE_NAME);
       return false;
   }
   /**
   * 查询数据库
   */
   @Override
   public Cursor query(Uri uri, String[] projection, String selection,
   String[] selectionArgs, String sortOrder) {
       //创建一个执行查询的Sqlite
       SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
       //判断用户请求,查询所有还是单个
       switch(uriMatcher.match(uri)){
           case INCOMING_USER_COLLECTION:
               //设置要查询的表名
               qb.setTables(UserTableMetaData.TABLE_NAME);
               //设置表字段的别名
               qb.setProjectionMap(userProjectionMap);
               break;
           case INCOMING_USER_SINGLE:
               qb.setTables(UserTableMetaData.TABLE_NAME);
               qb.setProjectionMap(userProjectionMap);
               //追加条件,getPathSegments()得到用户请求的Uri地址截取的数组,get(1)得到去掉地址中/以后的第二个元素
               qb.appendWhere(UserTableMetaData._ID + "=" + uri.getPathSegments().get(1));
               break;
           }
           //设置排序
           String orderBy;
           if(TextUtils.isEmpty(sortOrder)){
           orderBy = UserTableMetaData.DEFAULT_SORT_ORDER;
       }
       else{
           orderBy = sortOrder;
       }
       //得到一个可读的数据库
       SQLiteDatabase db = dh.getReadableDatabase();
       //执行查询,把输入传入
       Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);
       //设置监听
       c.setNotificationUri(getContext().getContentResolver(), uri);
       return c;
   }
   /**
   * 更新数据库
   */
   @Override
   public int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {
       System.out.println("update");
       //得到一个可写的数据库
       SQLiteDatabase db = dh.getWritableDatabase();
       //执行更新语句,得到更新的条数
       int count = db.update(UserTableMetaData.TABLE_NAME, values, selection, selectionArgs);
       return count;
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值