ContentProvider中的数据生成时机
目录结构:
,
先给个结论:
仅仅是实例化mySqliteHelper()这个类的时候是不会创建数据库的,实际上数据库的真正创建是在helper.getWritableDatabase()的方法执行后才会真正创建,或者执行helper.getReadableDatabase()也会创建数据库(如果没有数据库的话)
安卓好这个应用控制台的System.out.print()的所有输出内容为:
09-09 05:30:28.892: I/System.out(2764): myContentProvider.static{} 静态代码块。。。。
09-09 05:30:28.904: I/System.out(2764): ==看看实例化本类的时候,是否会执行到我.....==
09-09 05:30:28.912: I/System.out(2764): helper实际上已经实例化了。。。
09-09 05:30:29.096: I/System.out(2764): mySqliteHelper onCreate(SQLiteDatabase db)方法......
09-09 05:30:29.144: I/System.out(2764): myContentProvider.onCreate()方法,实际上应该已经创建了数据库
09-09 05:30:29.144: I/System.out(2764): myContentProvider.onCreate()方法, jianli le zhangyalan.db
MainActivity.java
- package com.wyl.contentprovidermine;
- import android.app.Activity;
- import android.content.ContentResolver;
- import android.content.ContentValues;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- public class MainActivity extends Activity implements OnClickListener{
- Button btn_insert;
- Button btn_select;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- btn_insert = (Button) findViewById(R.id.btn_insert);
- btn_select = (Button) findViewById(R.id.btn_select);
- btn_insert.setOnClickListener(this);
- }
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.btn_insert:
- ContentResolver cr = getContentResolver();
- ContentValues values = new ContentValues();
- values.put(myMetaData.UserTableMetaData.NAME, "zyl");
- values.put(myMetaData.UserTableMetaData.AGE, 21);
- values.put(myMetaData.UserTableMetaData.SEX, "女");
- // Uri uri = new URI()
- System.out.println("点了insert按钮......");
- cr.insert(myMetaData.UserTableMetaData.CONTENT_URI, values);
- System.out.println("点了insert按钮------------------");
- break;
- case R.id.btn_select:
- System.out.println("查询数据......");
- break;
- }
- }
- }
myContentProvider.java
- package com.wyl.contentprovidermine;
- import android.content.ContentProvider;
- import android.content.ContentUris;
- import android.content.ContentValues;
- import android.content.UriMatcher;
- import android.database.Cursor;
- import android.database.sqlite.SQLiteDatabase;
- import android.net.Uri;
- public class myContentProvider extends ContentProvider {
- mySqliteHelper helper;
- SQLiteDatabase db;
- private static final UriMatcher myUriMatcher = new UriMatcher(
- UriMatcher.NO_MATCH);
- public static final int USERS = 1;// 代表表名
- public static final int USERS_NAME = 2; // 字段名
- public static final int USERS_SEX = 3; // 字段名 ,性别
- public static final int USERS_AGE = 4; // 字段名,年龄
- public static final int USERS_SINGLE = 5;
- static {
- System.out.println("myContentProvider.static{} 静态代码块。。。。");
- myUriMatcher.addURI(myMetaData.AUTHORITY, "/users", USERS);// 匹配表名
- myUriMatcher.addURI(myMetaData.AUTHORITY, "/users/name", USERS_NAME);
- myUriMatcher.addURI(myMetaData.AUTHORITY, "/users/sex", USERS_SEX);
- myUriMatcher.addURI(myMetaData.AUTHORITY, "/users/age", USERS_AGE);// 只能匹配age这个字段
- myUriMatcher.addURI(myMetaData.AUTHORITY, "/users/#", USERS_SINGLE);// 这个可以匹配任何字段名
- }
- @Override
- public boolean onCreate() {
- // TODO Auto-generated method stub
- /*
- * 创建数据库,同时也会生成表,见mySqliteHelper的onCreate()方法, 这个方法里有创建表的代码
- */
- /*
- * 如果这行代码(helper = new mySqliteHelper(getContext(),"zhangyalan.db");)注释掉了,那么当
- * 插入数据的时候执行下面的insert方法的时候就会空指针异常,因为在清单文件中配置了,所以这个android app
- * 安装的时候,就会执行这个类,即 myContentProvider.java ,而且 在这个类里,首先执行静态代码块里的代码,
- * 然后执行本方法myContentProvider.onCreate(),本类的其他方法,如insert(),query()等方法,只
- * 有用户在手机界面进行操作的时候才会执行到。知道了这里的执行顺序那么就很容易理解为什么下面的这行代码注释掉了就会
- * 导致用户插入数据的时候会导致空指针异常了(因为 helper没有实例化),自己写一个ContentProvider的时候要首
- * 先实例化这里就提示了我们很重要的一点,即实例化SQLiteOpenHelper的时机一定要早,比如放到静态代码块
- * 或者onCreate()方法里
- */
- helper = new mySqliteHelper(getContext(), "zhangyalan.db");// 这行代码千万要实例化
- if (helper == null) {
- System.out.println("helper实际上还没实例化");
- } else {
- System.out.println("helper实际上已经实例化了。。。");
- }
- helper.getWritableDatabase();
- System.out.println("myContentProvider.onCreate()方法,实际上应该已经创建了数据库");
- System.out
- .println("myContentProvider.onCreate()方法, jianli le zhangyalan.db");
- return true;
- }
- @Override
- public Cursor query(Uri uri, String[] projection, String selection,
- String[] selectionArgs, String sortOrder) {
- // TODO Auto-generated method stub
- return null;
- }
- // 作用:根据传入的URI,返回该URI所表示的数据类型
- @Override
- public String getType(Uri uri) {
- // TODO Auto-generated method stub
- System.out.println("public String getType(Uri uri) 开始了。。。。。。");
- switch (myUriMatcher.match(uri)) {
- case USERS:
- return myMetaData.UserTableMetaData.CONTENT_TYPE;
- case USERS_SINGLE:
- return myMetaData.UserTableMetaData.CONTENT_TYPE_ITEM;
- default:
- throw new IllegalArgumentException("未知的uri,unknow URI..." + uri);
- }
- }
- @Override
- public Uri insert(Uri uri, ContentValues values) {
- System.out.println("myContentProvider.insert()......1 ");
- /*
- * 仅仅是实例化mySqliteHelper()这个类的时候是不会创建数据库的
- * 实际上数据库的真正创建是在helper.getWritableDatabase()的方法执行后才会真正创建,
- * 或者执行helper.getReadableDatabase()也会创建数据库(如果没有数据库的话)
- */
- db = helper.getWritableDatabase();
- System.out.println("myContentProvider.insert()......2 ");
- long rowId = db.insert(myMetaData.UserTableMetaData.TABLE_NAME, null,
- values);
- if (rowId > 0) {
- Uri rtnUri = ContentUris.withAppendedId(uri, rowId);
- System.out.println("myContentProvider.insert()......3 ");
- return rtnUri;
- }
- System.out.println("myContentProvider.insert()......4 ");
- return null;
- }
- @Override
- public int delete(Uri uri, String selection, String[] selectionArgs) {
- // TODO Auto-generated method stub
- return 0;
- }
- @Override
- public int update(Uri uri, ContentValues values, String selection,
- String[] selectionArgs) {
- // TODO Auto-generated method stub
- return 0;
- }
- }
mySqliteHelper.java
- package com.wyl.contentprovidermine;
- import android.content.Context;
- import android.database.sqlite.SQLiteDatabase;
- import android.database.sqlite.SQLiteDatabase.CursorFactory;
- import android.database.sqlite.SQLiteOpenHelper;
- public class mySqliteHelper extends SQLiteOpenHelper {
- static {
- System.out.println("==看看实例化本类的时候,是否会执行到我.....==");
- }
- public mySqliteHelper(Context context, String name, CursorFactory factory,
- int version) {
- super(context, name, factory, version);
- // TODO Auto-generated constructor stub
- }
- public mySqliteHelper(Context context, String name, int version) {
- super(context, name, null, version);
- // TODO Auto-generated constructor stub
- }
- /**
- * 两个参数的构造器,用来创建数据库
- *
- * @param context
- * activity
- * @param name
- * 数据库名
- */
- public mySqliteHelper(Context context, String name) {
- this(context, name, 1);
- // TODO Auto-generated constructor stub
- }
- /**
- * 这个方法主要是用来创建 表的, 现在的疑问是 数据库是是什么时候创建的:实际上数据库是实例化该MySqliteHelper的时候
- * 并没有创建数据库,数据库的真正创建是在helper.getWritableDatabase()的方法执
- * 行后才会真正创建,或者执行helper.getReadableDatabase()也会创建数据库(如果没有数据库的话)
- */
- @Override
- public void onCreate(SQLiteDatabase db) {
- // TODO Auto-generated method stub
- System.out
- .println("mySqliteHelper onCreate(SQLiteDatabase db)方法......");
- db.execSQL(myMetaData.UserTableMetaData.CREATE_TABLE_SQL);// 创建表
- }
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- // TODO Auto-generated method stub
- }
- }
myMetaData.java
- package com.wyl.contentprovidermine;
- import android.net.Uri;
- import android.provider.BaseColumns;
- public class myMetaData {
- //AUTHORITY 是一个类名,即contentprovider的类名
- public static final String AUTHORITY = "com.wyl.contentprovidermine";
- //数据库名称
- public static final String DATABASE_NAME = "wyl.db";
- //表名
- public static final String USER_TABLE_NAME = "users";
- public static class UserTableMetaData implements BaseColumns{
- //字表名称
- public static final String TABLE_NAME = "users";
- public static final Uri CONTENT_URI = Uri.parse("content://"+AUTHORITY+"/users");
- //1 content 2 AUTHORITY 3.字标的名字
- public static final String NAME = "name";
- public static final String SEX = "sex";
- public static final String AGE = "age";
- public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.myprovider.users";
- //上面的 CONTENT_TYPE: 其中的 vnd.android.cursor.dir/vnd 是固定的, 后面的 myprovider.users 自己随便定义
- public static final String CONTENT_TYPE_ITEM = "vnd.android.cursor.item/vnd.myprovider.users";
- public static final String DEFAULT_SORT_ORDER = "_id desc";
- public static final String CREATE_TABLE_SQL = "create table if not exists "+TABLE_NAME + " (_id integer primary key autoincrement,name text not null,sex text,age integer not null) ";
- }
- }
ContentProvider中的数据生成时机的更多相关文章
- java中json数据生成和解析(复杂对象演示)
1.json简单介绍 1.1 json是最流行和广泛通用的数据传输格式,简称JavaScript Object Notation,最早在JavaScript中使用. 1.2 举个例子,下面是一个jso ...
- loadrunner之Paramater在负载测试中的数据生成规则
前段时间在做性能测试的时候,基于业务的需求,使用到了Unique Number的参数类型. 脚本的业务是注册以alien开头,后面接数字的用户帐号,填写相关帐号信息.提交企业信息进行审核. 其中用户帐 ...
- 利用存储过程将表中的数据生成Insert语句
1.创建存储过程 CREATE PROC [dbo].[sp_get_InsertSql] @dbName VARCHAR ( )= '' , -- 数据库名称 @tabList VARCHAR ( ...
- 将excle表中得数据生成insert语句插入到数据库中
第一步:输入公式 第二步:拽住右下角得+往下拖拽
- ContentProvider中的数据库的生成时机以及ContentResolver的insert()方法总结
经过几天的总结,以及结合一些代码的实际测试,终于算是明白了ContentProvider中的数据的生成时机了. 目录结构: MainActivity.java package com.wyl.cont ...
- 快速将一个表的数据生成SQL插入语句
将一个表中的数据生成SQL插入语句,方便系统快速初始化,在数据库中执行创建以下过程就可以了. ) Drop Procedure GenerateData go CREATE PROCEDURE Gen ...
- 安卓中的数据存储方式以及ContentProvider的简单介绍
1.介绍android的数据存储方式 File存储 sharedPrefrence存储方式 conmtentprovider sqlitedatabase 网络存储 2.请介绍下ContentPr ...
- 将表中数据生成SQL语句
在开发过程中,经常需要我们对表中的数据进行转移,如果在同台机器,可以使用SQL自带的导入数据,但是如果想让所有的数据生成可执行的SQL语句,它的移植性最强了.首先要设计一个存储过程.具体如下: CRE ...
- c#保存datagridview中的数据时报错 “动态SQL生成失败。找不到关键信息”
ilovejinglei 原文 C#中保存datagridview中的数据时报错"动态SQL生成失败.找不到关键信息" 问题描述 相关代码 using System; us ...
随机推荐
- Ubuntu安装配置TFTP服务
tftpd-hpa 是一个功能增强的TFTP服务器.它提供了很多TFTP的增强功能,它已经被移植到大多数的现代UNIX系统. 1.安装 sudo apt-get install tftpd-hpa t ...
- js函数调用模式总结
在javascript中一共有四种调用模式:方法调用模式.函数调用模式.构造器调用模式和apply调用模式.这些模式在如何初始化关键参数this上存在差异 方法调用模式 当一个函数被保存为对象的一个属 ...
- document.compatMode简介
对于document.compatMode,很多朋友可能很少接触,知道他的存在却不清楚他的用途.今天在ext中看到 document.compatMode的使用,感觉这个对于我们开发兼容性的web页面 ...
- Ubuntu 12.10 安装JDK7
1.首先到oracle下载上下载jdk-7u25-linux-i586.tar.gz 2.将jdk-7u25-linux-i586.tar.gz复制到/usr/lib/jvm/目录以下,这里假设没有j ...
- python第三方模块
python相关:1.zeromq网络库:2.twisted框架:twisted:一个基于事件驱动,异步的python高性能网络开发框架:注:什么是基于事件驱动:当(鼠标点击事件)事件注册器注入事件, ...
- 【转】android开发中关于模拟器emulation的常见问题
[转]android开发中关于模拟器emulation的常见问题 Trouble: 无法启动android模拟器,提示 XDM authorization key matches an existin ...
- C#面向对象编程基础-喜课堂笔记
**************[5][C#面向对象编程基础]第1讲:类与对象**************** *************2.1.1_类与对象的概念**** ...
- java线程池分析和应用
比较 在前面的一些文章里,我们已经讨论了手工创建和管理线程.在实际应用中我们有的时候也会经常听到线程池这个概念.在这里,我们可以先针对手工创建管理线程和通过线程池来管理做一个比较.通常,我们如果手工创 ...
- scanf 与 cin 的区别
在论坛上看到有人提出一个如下的问题,在此总结一下. 原问题: http://topic.csdn.net/u/20110414/22/90d0606c-9876-48e4-9b69-bd8bd8a41 ...
- BZOJ 1718: [Usaco2006 Jan] Redundant Paths 分离的路径( tarjan )
tarjan求边双连通分量, 然后就是一棵树了, 可以各种乱搞... ----------------------------------------------------------------- ...