初识 sqlite 与 content provider 学习笔记

简介:

1,SQLite 简单使用

1,SQLite支持的数据类型

  • NULL. The value is a NULL value.

  • INTEGER. The value is a signed integer, stored in 1, 2, 3, 4, 6, or 8 bytes depending on the magnitude of the value.

  • REAL. The value is a floating point value, stored as an 8-byte IEEE floating point number.

  • TEXT. The value is a text string, stored using the database encoding (UTF-8, UTF-16BE or UTF-16LE).

  • BLOB. The value is a blob of data, stored exactly as it was input. 

2,相关数据库定义数据类型词与SQLite数据类型的关联表

Example Typenames From The 
CREATE TABLE Statement 
or CAST Expression
Resulting Affinity Rule Used To Determine Affinity
INT 
INTEGER 
TINYINT 
SMALLINT 
MEDIUMINT 
BIGINT 
UNSIGNED BIG INT 
INT2 
INT8
INTEGER 1
CHARACTER(20) 
VARCHAR(255) 
VARYING CHARACTER(255) 
NCHAR(55) 
NATIVE CHARACTER(70) 
NVARCHAR(100) 
TEXT 
CLOB
TEXT 2
BLOB 
no datatype specified
NONE 3
REAL 
DOUBLE 
DOUBLE PRECISION 
FLOAT
REAL 4
NUMERIC 
DECIMAL(10,5) 
BOOLEAN 
DATE 
DATETIME
NUMERIC 5

 

把数据类型搞定了…我们就开始使用我们的android的sqlite了…

第一步:实现一个SQLiteOpenHelper类 


      
      
  1. //创建一个继承SQLiteOpenHelper类  
  2. public class MyOpenHelper extends SQLiteOpenHelper{  
  3. //必须实现的一个构造方法public MyOpenHelper(Context context, String name, CursorFactory factory,            int version) {        super(context, name, factory, version);          
  4. // TODO Auto-generated constructor stub    }       
  5. //设置数据库初始化版本号      
  6. private static final int DATABASE_VERSION = 1;           
  7. //设置数据库创建的表名      
  8. private static final String TABLE_NAME = "users";           
  9. //构建创建表的 SQL 的语句      
  10. private static final String TABLE_CREATE_SQL = "CREATE TABLE " +              
  11. TABLE_NAME+"(id INTEGER primary key,name TEXT)";      
  12. //自定义构造方法传入content,与数据库名字      
  13. public MyOpenHelper(Context context,String name){        this(context,name,null,DATABASE_VERSION);    }           
  14. //自定义构造方法传入用来升级数据库的版本号      
  15. public MyOpenHelper(Context context,String name,int version){          
  16. this(context,name,null,version);            }                        @Override    public void onCreate(SQLiteDatabase db) {          
  17. // TODO Auto-generated method stub          
  18. Log.d("sqlite","sql-->CreateTable"+ TABLE_CREATE_SQL);                   
  19. db.execSQL(TABLE_CREATE_SQL);    }       
  20. @Override      
  21. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {          
  22. // TODO Auto-generated method stub     }       } 

ok

第二步:使用MyOpenHelper


     
     
  1. //某
  2. String dataBaseName = "employee"';
  3. MyOpenHelper moh = new MyOpenHelper(Sqlite_contentproviderActivity.this,dataBaseName );
  4. SQLiteDatabase sdb = moh.getReadableDatabase();
  5. toastSQL = Toast.makeText(context, "创建数据库成功", Toast.LENGTH_LONG);
  6. toastSQL.show();

1,我们到adb 中查看在设备中我们保存的数据库文件在

cd /data/data/<package_name>/databases

2,ls 命令看下

3,用sqlite3命令进入数据库

这样我们就看到我们刚才创建的表了…

这里给出插入操作的代码


     
     
  1. String databaseName = "employee";           
  2. MyOpenHelper moh = new MyOpenHelper(Sqlite_contentproviderActivity.this, databaseName);      
  3. //获取一个可写操作      
  4. SQLiteDatabase sdb = moh.getWritableDatabase();  
  5. ContentValues cv = new ContentValues();      
  6. String[] name = {"tom","achai","nevin","week"};           
  7. for (int i = 0; i < name.length; i++) {          
  8. cv.put("name"name[i]);          
  9. sdb.insert("users"null, cv);      

剩下的操作…请阅读官方文档SQLiteDatabase里面的方法

2,创建属于自己的content provider

 

1,建立一个属于自己的content provider你必须要做

  1. 设置一个存储数据的地方,可以使用android 提供的文件存储方法,或者使用SQLite databases,然而,你可以存储任何你想要的数据,android提供的SQLiteOpenHelper可以帮助你创建属于和管理你自己的数据库,
  2. 实现ContentProvider 提供用于访问数据的类
  3. 在AndroidManifest.xml,声明你的 content provider

2,编写一个数据工具类

       
       
  1. public class ContentProviderData {       
  2. public static final String AUTHORIY = "kg.tom.FirstProvider";       
  3. public class ContentProviderData {      
  4. //定义我们provider使用的认证uri      
  5. public static final String AUTHORIY = "kg.tom.FirstProvider";      
  6. //定义我们数据库的名字      
  7. public static final String DATABASE_NAME = "kg_tom_pro_test";      
  8. //定义数据库的版本号      
  9. public static final int DATABASE_VERSION = 1;      
  10. //定义创建表的名字      
  11. public static final String USERS_TABLE_NAME = "users" ;      
  12. //实现BaseColums,自带两列,_id,_count      
  13. public static final class UserTableMetaData implements BaseColumns{   
  14. //定义创建表的名字          
  15. public static final String TABLE_NAME = "users";          
  16. //定义provider的uri          
  17. public static final Uri CONTENT_URI = Uri.parse("content://"+AUTHORIY + "/users");          
  18. //定义一条数据的类型          
  19. public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.firstprovider.user";         
  20. //定义一组数据的类型   
  21. public static final String CONTENT_TYPE_ITEM = "vnd.android.cursor.item/vnd.firsstprovider.user";       
  22. //定义列名          
  23. public static final String USER_NAME = "name";          
  24. //定义排序规则          
  25. public static final String DEFULT_SORT_ORDER = "_id desc";               
  26. }     }   

 2,继承content provider 类

继承这个类我们同时要实现以下几个方法:

query()
insert()
update()
delete()
getType()
onCreate()

 

还有必须添加一个UriMatcher对象

关于UriMatcher对象的使用文档有很好的解释


     
     
  1. //定义URI标识符,数值定义请参考文档  
  2. public static final int INCOMING_USER_COLLECTION = 1;  
  3. public static final int INCOMING_USER_SINGLE = 2;  
  4. //定义UriMatcher对象  
  5. public static final UriMatcher uMatcher;  
  6. //把标识符加入到URI中,固定写法  
  7. static{      
  8. uMatcher = new UriMatcher(UriMatcher.NO_MATCH);      
  9. //第一个参数为  
  10. content provider authoriy      
  11. uMatcher.addURI(AUTHORIY, "users", INCOMING_USER_COLLECTION);      
  12. uMatcher.addURI(AUTHORIY, "users/#", INCOMING_USER_SINGLE);} 

一个完整的content provider


     
     
  1. public class FirstProvider extends ContentProvider {           
  2. //定义URI标识符      
  3. public static final int INCOMING_USER_COLLECTION = 1;      
  4. public static final int INCOMING_USER_SINGLE = 2;      
  5. //定义UriMatcher对象      
  6. public static final UriMatcher uMatcher;      
  7. //把标识符加入到URI中,固定写法      
  8. static{          
  9. uMatcher = new UriMatcher(UriMatcher.NO_MATCH);        uMatcher.addURI(ContentProviderData.AUTHORIY, "users", INCOMING_USER_COLLECTION);          
  10. uMatcher.addURI(ContentProviderData.AUTHORIY, "users/#", INCOMING_USER_SINGLE);    }      
  11. //这里是定义查询用的列名的别名      
  12. public static HashMap<String , String> userMap;      
  13. private DataBaseHelper dh;      
  14. static{          
  15. userMap = new HashMap<String, String>();          
  16. userMap.put(UserTableMetaData._ID, "id");          
  17. userMap.put(UserTableMetaData.USER_NAME,   
  18. UserTableMetaData.USER_NAME);    }           
  19. @Override      
  20. public int delete(Uri uri, String selection, String[] selectionArgs) {          
  21. // TODO Auto-generated method stub          
  22. return 0;    }                
  23. //根据传入的URI      
  24. @Override      
  25. public String getType(Uri uri) {          
  26. // TODO Auto-generated method stub          
  27. Log.d("sqlite""getType-->");                   
  28. switch(uMatcher.match(uri)){          
  29. case INCOMING_USER_COLLECTION:              
  30. return UserTableMetaData.CONTENT_TYPE;          
  31. case INCOMING_USER_SINGLE:              
  32. return UserTableMetaData.CONTENT_TYPE_ITEM;        default:              
  33. throw new IllegalArgumentException("unKnown uri" + uri);        }                      }       
  34. @Override      
  35. public Uri insert(Uri uri, ContentValues values) {          
  36. // TODO Auto-generated method stub                   
  37. Log.d("insert""class" + getClass());          
  38. Log.d("insert""content" + getContext());          
  39. SQLiteDatabase db = dh.getWritableDatabase();          
  40. long rowId = db.insert(UserTableMetaData.TABLE_NAME, nullvalues);                   
  41. if(rowId > 0){              
  42. Uri insertUri = ContentUris.withAppendedId  
  43. (UserTableMetaData.CONTENT_URI, rowId);              
  44. getContext().getContentResolver().notifyChange(insertUri, null);              
  45. return insertUri;        }                   
  46. return null;                  }           
  47. @Override      
  48. public boolean onCreate() {          
  49. // TODO Auto-generated method stub          
  50. Log.d("sqlite""createPro--->");          
  51. dh  = new DataBaseHelper(getContext(), ContentProviderData.DATABASE_NAME);      
  52. //  SQLiteDatabase db = dh.getReadableDatabase();        return true;    }       
  53. @Override      
  54. public Cursor query(Uri uri, String[] projection, String selection,              
  55. String[] selectionArgs, String sortOrder) {          
  56. // TODO Auto-generated method stub                   
  57. SQLiteQueryBuilder qb = new SQLiteQueryBuilder();                   
  58. switch(uMatcher.match(uri)){          
  59. case INCOMING_USER_COLLECTION:              
  60. qb.setTables(UserTableMetaData.TABLE_NAME);              
  61. qb.setProjectionMap(userMap);              
  62. break;          
  63. case INCOMING_USER_SINGLE:              
  64. qb.setTables(UserTableMetaData.TABLE_NAME);              
  65. qb.setProjectionMap(userMap);              
  66. qb.appendWhere(UserTableMetaData._ID+                    "=" +                      
  67. uri.getPathSegments().get(1)                    );              
  68. break;                  }          
  69. String orderBy;          
  70. if(TextUtils.isEmpty(sortOrder)){              
  71. orderBy = UserTableMetaData.DEFULT_SORT_ORDER;        }else{              
  72. orderBy = sortOrder;        }          
  73. SQLiteDatabase db = dh.getWritableDatabase();          
  74. Cursor c = qb.query(db, projection, selection,   
  75. selectionArgs, nullnull, sortOrder);                   
  76. c.setNotificationUri(getContext().getContentResolver(), uri);          
  77. Log.d("sqlite""first--->>");                          return c;    }       
  78. @Override      
  79. public int update(Uri uri, ContentValues values, String selection,              
  80. String[] selectionArgs) {          
  81. // TODO Auto-generated method stub          
  82. return 0;    } } 

3,在activity中的方法中用上这几行代码就可以进行插入


     
     
  1. //定义插入用数据的对象,本质是一个  
  2. map ContentValues values = new ContentValues();   
  3. //键,值对 values.put("id", 1);   
  4. //定义表名   
  5. String name = ContentProviderData.USERS_TABLE_NAME;   
  6. //键值对   
  7. values.put(ContentProviderData.UserTableMetaData.USER_NAME, "tom");  
  8. //进行content provider 的插入操作   
  9. Uri uri = getContentResolver().insert(   
  10. ContentProviderData.UserTableMetaData.CONTENT_URI, values); 

至于剩下的

query()

delete()

自己参照文档补全吧


本文转自 liam2199 博客,原文链接:http://blog.51cto.com/youxilua/773107   如需转载请自行联系原作者


相关文章
|
2月前
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
134 6
|
2月前
|
SQL Ubuntu 关系型数据库
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
本文为MySQL学习笔记,介绍了数据库的基本概念,包括行、列、主键等,并解释了C/S和B/S架构以及SQL语言的分类。接着,指导如何在Windows和Ubuntu系统上安装MySQL,并提供了启动、停止和重启服务的命令。文章还涵盖了Navicat的使用,包括安装、登录和新建表格等步骤。最后,介绍了MySQL中的数据类型和字段约束,如主键、外键、非空和唯一等。
75 3
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
|
1月前
|
存储 SQL 数据库
数据库知识:了解SQLite或其他移动端数据库的使用
【10月更文挑战第22天】本文介绍了SQLite在移动应用开发中的应用,包括其优势、如何在Android中集成SQLite、基本的数据库操作(增删改查)、并发访问和事务处理等。通过示例代码,帮助开发者更好地理解和使用SQLite。此外,还提到了其他移动端数据库的选择。
38 8
|
2月前
|
Web App开发 SQL 数据库
使用 Python 解析火狐浏览器的 SQLite3 数据库
本文介绍如何使用 Python 解析火狐浏览器的 SQLite3 数据库,包括书签、历史记录和下载记录等。通过安装 Python 和 SQLite3,定位火狐数据库文件路径,编写 Python 脚本连接数据库并执行 SQL 查询,最终输出最近访问的网站历史记录。
36 4
|
2月前
|
存储 关系型数据库 数据库
轻量级数据库的利器:Python 及其内置 SQLite 简介
轻量级数据库的利器:Python 及其内置 SQLite 简介
64 3
|
2月前
|
应用服务中间件 PHP Apache
PbootCMS提示错误信息“未检测到您服务器环境的sqlite3数据库扩展...”
PbootCMS提示错误信息“未检测到您服务器环境的sqlite3数据库扩展...”
|
3月前
|
存储 API 数据库
QML使用Sqlite数据库存储ListModel数据
本文介绍了在QML中使用Sqlite数据库存储ListModel数据的方法,包括如何创建数据库、读取数据、动态添加和删除数据,以及如何在程序启动和退出时与数据库同步数据。
|
3月前
|
数据库 数据库管理
qt对sqlite数据库多线程的操作
本文总结了在Qt中进行SQLite数据库多线程操作时应注意的四个关键问题,包括数据库驱动加载、加锁、数据库的打开与关闭,以及QsqlQuery变量的使用。
208 1
|
2月前
|
存储 缓存 关系型数据库
sqlite 数据库 介绍
sqlite 数据库 介绍
42 0
|
3月前
|
SQL 关系型数据库 MySQL
php学习笔记-连接操作mysq数据库(基础)-day08
本文介绍了PHP中连接操作MySQL数据库的常用函数,包括连接服务器、设置字符集、关闭连接、选择数据库、结果集释放、获取影响行数以及遍历结果集等操作。通过书籍查询的实例演示了如何使用这些函数进行数据库操作,并提供了一个PHP操纵MySQL数据库的模板。
php学习笔记-连接操作mysq数据库(基础)-day08