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

来源:互联网 发布:公路工程试验软件 编辑:程序博客网 时间:2024/05/16 15:03

第一节 用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;   }}
0 0
原创粉丝点击