作业——在线学习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
- 作业——在线学习Android课程之第六周
- 作业——在线学习Android课程之第二周
- 作业——在线学习Android课程之第三周
- 作业——在线学习Android课程之第五周
- 作业——在线学习Android课程之第一周
- 作业——在线学习Android课程之第四周
- 作业——在线学习Android课程之第七周(HttpURLConnection)
- 作业——在线学习Android课程之第八周(下载器)
- 作业——在线学习Android课程之第九周(进程与服务)
- 作业——在线学习Android课程之第十周(传感器与LBS)
- 作业——在线学习Android课程之第十周(Gradle、NDK、依赖)
- 作业——在线学习Android课程之第十二周(内存优化)
- 作业——在线学习Android课程之第十二周(内存、视图、电量优化)
- 作业——在线学习Android课程之第十三周(视图优化案例)
- 作业——在线学习Android课程之第十三周(图片优化)
- 作业——在线学习Android课程之第十五周(设计模式二)
- 作业——在线学习Android课程之第十四周(设计模式)
- coursera机器学习课程第六周——课程笔记
- java反射的field.get(null)
- mysql主从数据库简单实现
- GeoServer安装和发布服务
- Android进程优先级
- 随机数按指定格式 写入文件
- 作业——在线学习Android课程之第六周
- 使用DBCP,C3P0,druid,apache-jdbc配置JNDI数据源
- OC阅读笔记十七: "autorelease pool"降低内存峰值
- android Camera 数据流程分析
- 常见浏览器兼容性问题与解决方案
- *统计字符串中每个字符出现的个数
- Lua面向对象
- Java集合框架List,Map,Set等全面介绍
- java aqs原理浅析