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 ... 
随机推荐
- Python学习笔记 (3) :列表、元组的操作
			列表,即写在方括号之间.用逗号分隔开的数值列表.列表内的项目不必全是相同的类型. >>> a = ['spam', 'eggs', 100, 1234] >>> a ... 
- 转: vim简明教程
			vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类,你一定会对这个编辑器失去兴趣的.下面的文章翻译自<Learn Vim Progress ... 
- 调用firebug-lite调试ie6
			作为前端或网页开发者而言,在IE6上做CSS调试在之前简直是一个噩梦.作为前端或网页开发者而言,但这又是无法回避的事情.某日从红茶那边听说了Firebug Lite这个好东西,可以在不装插件的情况下, ... 
- 射频识别技术漫谈(13)——Mifare S50与Mifare S70
			Mifare S50和Mifare S70又常被称为Mifare Standard.Mifare Classic.MF1,是遵守ISO14443A标准的卡片中应用最为广泛.影响力最大的的一员.而Mif ... 
- Hierarchical Storage structure
			1.hierarchical storage structure This notion of inserting a smaller, faster storage device (e.g ... 
- poj 2263&& zoj1952 floyd
			Fiber Network Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2725 Accepted: 1252 Des ... 
- .Net将多个DLL打包为一个DLL(ILMerge)
			在做.Net底层编码过程中,为了功能独立,有可能会生成多个DLL,引用时非常不便.这方面微软提供了一个ILMerge工具原版DOS工具,可以将多个DLL合并成一个.下载完成后需要安装一下,然后通过DO ... 
- HTML+CSS基础总结
			1. 首先声明正确的文档类型doctype 通常有四种文档类型可供选择: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" ... 
- java之内存可见型
			1.可见性的概念 一个线程对于共享变量的修改,能够及时被其他的线程看到. 2.什么是共享变量 一个变量在多个线程中的工作内存中都存在变量副本,那么这个变量在这几个线程之间共享. 3.Java线程的工作 ... 
- java结构与算法之选择排序
			一 .java结构与算法之选择排序(冒择路兮快归堆) 什么事选择排序:从一组无序数据中选择出中小的的值,将该值与无序区的最左边的的值进行交换. 简单的解释:假设有这样一组数据 12,4,23,5,找到 ... 
