目录结构:

先给个结论:

  仅仅是实例化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中的数据生成时机的更多相关文章

  1. java中json数据生成和解析(复杂对象演示)

    1.json简单介绍 1.1 json是最流行和广泛通用的数据传输格式,简称JavaScript Object Notation,最早在JavaScript中使用. 1.2 举个例子,下面是一个jso ...

  2. loadrunner之Paramater在负载测试中的数据生成规则

    前段时间在做性能测试的时候,基于业务的需求,使用到了Unique Number的参数类型. 脚本的业务是注册以alien开头,后面接数字的用户帐号,填写相关帐号信息.提交企业信息进行审核. 其中用户帐 ...

  3. 利用存储过程将表中的数据生成Insert语句

    1.创建存储过程 CREATE PROC [dbo].[sp_get_InsertSql] @dbName VARCHAR ( )= '' , -- 数据库名称 @tabList VARCHAR ( ...

  4. 将excle表中得数据生成insert语句插入到数据库中

    第一步:输入公式 第二步:拽住右下角得+往下拖拽

  5. ContentProvider中的数据库的生成时机以及ContentResolver的insert()方法总结

    经过几天的总结,以及结合一些代码的实际测试,终于算是明白了ContentProvider中的数据的生成时机了. 目录结构: MainActivity.java package com.wyl.cont ...

  6. 快速将一个表的数据生成SQL插入语句

    将一个表中的数据生成SQL插入语句,方便系统快速初始化,在数据库中执行创建以下过程就可以了. ) Drop Procedure GenerateData go CREATE PROCEDURE Gen ...

  7. 安卓中的数据存储方式以及ContentProvider的简单介绍

    1.介绍android的数据存储方式 File存储 sharedPrefrence存储方式 conmtentprovider sqlitedatabase 网络存储   2.请介绍下ContentPr ...

  8. 将表中数据生成SQL语句

    在开发过程中,经常需要我们对表中的数据进行转移,如果在同台机器,可以使用SQL自带的导入数据,但是如果想让所有的数据生成可执行的SQL语句,它的移植性最强了.首先要设计一个存储过程.具体如下: CRE ...

  9. c#保存datagridview中的数据时报错 “动态SQL生成失败。找不到关键信息”

    ilovejinglei 原文 C#中保存datagridview中的数据时报错"动态SQL生成失败.找不到关键信息" 问题描述     相关代码 using System; us ...

随机推荐

  1. hadoop 主节点存储告警

    之前只他调整过dfs 的存储目录到最大配额的目录,其它没有处理(就是在默认的/ 目录下,而这个目录的存储配额只有50G) 运行一周的时间不到,集群开始告警,查看是目录/ 的存储占用超过了60% 再查看 ...

  2. django FileFIeld和ImageField 上传路径改写

    def get_file_path(instance, filename): return 'file/document/%s/%s/%s' % (instance.period.code, inst ...

  3. SMTP 553

    当邮件使用SMTP协议 身份认证时,如果出现 javax.mail.AuthenticationFailedException: 535 5.7.3 Authentication unsuccessf ...

  4. 网页压缩gzip的问题及说明教程

    关于网页压缩gzip的问题及说明教程 最近比较多人反应gzip的问题 在wdcp的后台里已经有gzip功能的选项,也就是说,只要在这里开启了,就已支持 但从最近的问题中发现,基本上都是使用一些在线检测 ...

  5. sql 时间和字符串 取到毫秒级

    (select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),'-',''),' ',''),':','')+(Select ri ...

  6. 【转】KVM/Installation

    [转]KVM/Installation Installation Pre-installation checklist Check that your CPU supports hardware vi ...

  7. html相关介绍

    HTML(超文本标记语言)  超文本标记语言,即HTML(Hypertext Markup Language),是用于描述网页文档的一种标记语言 XHTML1.0 可扩展超文本置标语言(eXtensi ...

  8. Orchard 添加搜索栏

    Orchard 提供索引和搜索的功能. 索引功能需要开启 Indexing 模块, 同时我们要开启Lucene 模块(做实际检索工作的东西). 然后还要开启Search模块(调用Lucene 查询然后 ...

  9. Apache+php+mysql+phpadmin搭建

    一,准备工具. httpd-2.4.12-win32-VC9.zip php-5.4.40-Win32-VC9-x86.zip phpMyAdmin-4.2.13.2-all-languages my ...

  10. json所需jar包 & js解析后台json数据

    Json 所需jar包: var listxxx='<%=request.getAttribute("listxxx")%>';  // list数组 var mapx ...