ContentProvider中的数据生成时机

MainActivity.java

 1 package com.wyl.contentprovidermine;
 2
 3
 4 import android.app.Activity;
 5 import android.content.ContentResolver;
 6 import android.content.ContentValues;
 7 import android.os.Bundle;
 8 import android.view.View;
 9 import android.view.View.OnClickListener;
10 import android.widget.Button;
11 public class MainActivity extends Activity implements OnClickListener{
12     Button btn_insert;
13     Button btn_select;
14     @Override
15     protected void onCreate(Bundle savedInstanceState) {
16         super.onCreate(savedInstanceState);
17         setContentView(R.layout.activity_main);
18         btn_insert = (Button) findViewById(R.id.btn_insert);
19         btn_select = (Button) findViewById(R.id.btn_select);
20         btn_insert.setOnClickListener(this);
21     }
22     @Override
23     public void onClick(View v) {
24         switch (v.getId()) {
25         case R.id.btn_insert:
26             ContentResolver cr = getContentResolver();
27             ContentValues values = new ContentValues();
28             values.put(myMetaData.UserTableMetaData.NAME, "zyl");
29             values.put(myMetaData.UserTableMetaData.AGE, 21);
30             values.put(myMetaData.UserTableMetaData.SEX, "女");
31 //            Uri uri = new URI()
32             System.out.println("点了insert按钮......");
33             cr.insert(myMetaData.UserTableMetaData.CONTENT_URI, values);
34             System.out.println("点了insert按钮------------------");
35             break;
36
37         case R.id.btn_select:
38             System.out.println("查询数据......");
39             break;
40         }
41     }
42 }

myContentProvider.java

  1 package com.wyl.contentprovidermine;
  2
  3 import android.content.ContentProvider;
  4 import android.content.ContentUris;
  5 import android.content.ContentValues;
  6 import android.content.UriMatcher;
  7 import android.database.Cursor;
  8 import android.database.sqlite.SQLiteDatabase;
  9 import android.net.Uri;
 10
 11 public class myContentProvider extends ContentProvider{
 12     mySqliteHelper helper;
 13     SQLiteDatabase db;
 14     private static final UriMatcher myUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
 15     public static final int USERS = 1;//代表表名
 16     public static final int USERS_NAME = 2; //字段名
 17     public static final int USERS_SEX = 3;  //字段名 ,性别
 18     public static final int USERS_AGE = 4;  //字段名,年龄
 19     public static final int USERS_SINGLE = 5;
 20     static{
 21         System.out.println("myContentProvider.static{} 静态代码块。。。。");
 22         myUriMatcher.addURI(myMetaData.AUTHORITY, "/users", USERS);//匹配表名
 23         myUriMatcher.addURI(myMetaData.AUTHORITY, "/users/name", USERS_NAME);
 24         myUriMatcher.addURI(myMetaData.AUTHORITY, "/users/sex", USERS_SEX);
 25         myUriMatcher.addURI(myMetaData.AUTHORITY, "/users/age", USERS_AGE);//只能匹配age这个字段
 26         myUriMatcher.addURI(myMetaData.AUTHORITY, "/users/#", USERS_SINGLE);//这个可以匹配任何字段名
 27     }
 28
 29
 30     @Override
 31     public boolean onCreate() {
 32         // TODO Auto-generated method stub
 33         /*
 34          * 创建数据库,同时也会生成表,见mySqliteHelper的onCreate()方法,
 35          * 这个方法里有创建表的代码
 36          */
 37         /*
 38          * 如果这行代码(helper = new mySqliteHelper(getContext(), "zhangyalan.db");)注释掉了,那么当
 39          * 插入数据的时候执行下面的insert方法的时候就会空指针异常,因为在清单文件中配置了,所以这个android app安装的时候,就
 40          * 会执行这个类,即 myContentProvider.java ,而且 在这个类里,首先执行静态代码块里的代码,然后执
 41          * 行本方法myContentProvider.onCreate(),本类的其他方法,如insert(),query()等方法,只有用
 42          * 户在手机界面进行操作的时候才会执行到。知道了这里的执行顺序那么就很容易理解为什么下面的这行代码注释掉了就会导
 43          * 致用户插入数据的时候会导致空指针异常了(因为 helper没有实例化),自己写一个ContentProvider的时候要首先实例化
 44          * 这里就提示了我们很重要的一点,即实例化SQLiteOpenHelper的时机一定要早,比如放到静态代码块或者onCreate()方法里
 45          */
 46         helper = new mySqliteHelper(getContext(), "zhangyalan.db");//这行代码千万要实例化
 47         if(helper!=null){
 48             System.out.println("helper实际上还没实例化");
 49         }else{
 50             System.out.println("helper实际上已经实例化了。。。");
 51         }
 52         System.out.println("myContentProvider.onCreate()方法,  jianli le zhangyalan.db");
 53         return true;
 54     }
 55
 56     @Override
 57     public Cursor query(Uri uri, String[] projection, String selection,
 58             String[] selectionArgs, String sortOrder) {
 59         // TODO Auto-generated method stub
 60         return null;
 61     }
 62     //作用:根据传入的URI,返回该URI所表示的数据类型
 63     @Override
 64     public String getType(Uri uri) {
 65         // TODO Auto-generated method stub
 66         System.out.println("public String getType(Uri uri) 开始了。。。。。。");
 67         switch (myUriMatcher.match(uri)) {
 68         case USERS:
 69             return myMetaData.UserTableMetaData.CONTENT_TYPE;
 70
 71         case USERS_SINGLE:
 72             return myMetaData.UserTableMetaData.CONTENT_TYPE_ITEM;
 73         default:
 74             throw new IllegalArgumentException("未知的uri,unknow URI..."+uri);
 75         }
 76     }
 77
 78     @Override
 79     public Uri insert(Uri uri, ContentValues values) {
 80         System.out.println("myContentProvider.insert()......1 ");
 81         db = helper.getWritableDatabase();
 82         System.out.println("myContentProvider.insert()......2 ");
 83         long rowId = db.insert(myMetaData.UserTableMetaData.TABLE_NAME, null, values);
 84         if(rowId>0){
 85             Uri rtnUri = ContentUris.withAppendedId(uri, rowId);
 86             System.out.println("myContentProvider.insert()......3 ");
 87             return rtnUri;
 88         }
 89         System.out.println("myContentProvider.insert()......4 ");
 90         return null;
 91     }
 92
 93     @Override
 94     public int delete(Uri uri, String selection, String[] selectionArgs) {
 95         // TODO Auto-generated method stub
 96         return 0;
 97     }
 98
 99     @Override
100     public int update(Uri uri, ContentValues values, String selection,
101             String[] selectionArgs) {
102         // TODO Auto-generated method stub
103         return 0;
104     }
105
106 }

mySqliteHelper.java

 1 package com.wyl.contentprovidermine;
 2
 3 import android.content.Context;
 4 import android.database.sqlite.SQLiteDatabase;
 5 import android.database.sqlite.SQLiteDatabase.CursorFactory;
 6 import android.database.sqlite.SQLiteOpenHelper;
 7
 8 public class mySqliteHelper extends SQLiteOpenHelper{
 9
10     static{
11
12         System.out.println("==看看实例化本类的时候,是否会执行到我.....==");
13     }
14     public mySqliteHelper(Context context, String name, CursorFactory factory,
15             int version) {
16         super(context, name, factory, version);
17         // TODO Auto-generated constructor stub
18     }
19     public mySqliteHelper(Context context, String name,
20             int version) {
21         super(context, name, null, version);
22         // TODO Auto-generated constructor stub
23     }
24
25     /**
26      * 两个参数的构造器,用来创建数据库
27      * @param context  activity
28      * @param name          数据库名
29      */
30     public mySqliteHelper(Context context, String name) {
31         this(context, name, 1);
32         // TODO Auto-generated constructor stub
33     }
34
35     /**
36      *  这个方法主要是用来创建 表的,
37      *  现在的疑问是 数据库是是什么时候创建的:实际上数据库是实例化该MySqliteHelper的时候
38      *  创建,
39      */
40     @Override
41     public void onCreate(SQLiteDatabase db) {
42         // TODO Auto-generated method stub
43         System.out.println("mySqliteHelper onCreate(SQLiteDatabase db)方法......");
44         db.execSQL(myMetaData.UserTableMetaData.CREATE_TABLE_SQL);//创建表
45     }
46
47     @Override
48     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
49         // TODO Auto-generated method stub
50
51     }
52
53 }

myMetaData.java

 1 package com.wyl.contentprovidermine;
 2
 3 import android.net.Uri;
 4 import android.provider.BaseColumns;
 5
 6 public class myMetaData {
 7     //AUTHORITY 是一个类名,即contentprovider的类名
 8     public static final String AUTHORITY = "com.wyl.contentprovidermine";
 9     //数据库名称
10     public static final String DATABASE_NAME = "wyl.db";
11     //表名
12     public static final String USER_TABLE_NAME = "users";
13
14     public static class UserTableMetaData implements BaseColumns{
15         //字表名称
16         public static final String TABLE_NAME = "users";
17
18         public static final Uri CONTENT_URI = Uri.parse("content://"+AUTHORITY+"/users");
19                                                         //1 content 2 AUTHORITY 3.字标的名字
20         public static final String NAME = "name";
21         public static final String SEX = "sex";
22         public static final String AGE = "age";
23
24         public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.myprovider.users";
25         //上面的 CONTENT_TYPE: 其中的 vnd.android.cursor.dir/vnd 是固定的, 后面的 myprovider.users 自己随便定义
26         public static final String CONTENT_TYPE_ITEM = "vnd.android.cursor.item/vnd.myprovider.users";
27
28         public static final String DEFAULT_SORT_ORDER = "_id desc";
29
30         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) ";
31     }
32
33
34 }
时间: 2024-10-25 07:42:23

ContentProvider中的数据生成时机的相关文章

LoadRunner之Paramater在负载测试中的数据生成规则

LoadRunner之Paramater在负载测试中的数据生成规则 前段时间在做性能测试的时候,基于业务的需求,使用到了Unique Number的参数类型. 脚本的业务是注册以alien开头,后面接数字的用户帐号,填写相关帐号信息.提交企业信息进行审核. 其中用户帐号是alien开头拼接一个唯一数字的参数,如图: 下面对Unique Number进行相关解释,先引用官方资料:(相信大家也理解这段话的意思) Unique Number: Assigns a range of numbers to

在AcGIS中用大数据生成DEM

在ArcGIS中生成DEM时,采用的数据源往往是一些高程点.等高线,这些高程点.等高线比较密集,可能有好几千万个,甚至上亿个高程点.等高线.若利用这些矢量数据生成TIN,一般是不能实现的,因为生成TIN时,支持的最大结点数只能有几千万个(依据电脑性能,受限于内存).另外矢量信息的存储也是比较讲究的,如果把这些矢量信息存储在shp文件中,往往会出现问题(比如在arcmap中加载时出现的绘制错误).综合以上问题,感觉采用如下办法比较可取. 1. 矢量信息存储在Geodatabase中 把矢量信息用统

jquery 读取页面表格中的数据 生成批量insert代码 并以ajax方式传给后台

表格的格式较为常规,首行为字段,以下各行为数据,表格的id为detailList . $("#submitExcel").click(function(){ //绑定单击事件 insertStr="insert into funddetail values"; // insert字符串的初始值 $("#detailList tr:gt(0)").each(function(i){ //获取表格除首行外的所有行,并给每一行添加方法 insertSt

ContentProvider中的数据库的生成时机总结

经过几天的总结,以及结合一些代码的实际测试,终于算是明白了ContentProvider中的数据的生成时机了. 目录结构: MainActivity.java 1 package com.wyl.contentprovidermine2; 2 3 4 import android.app.Activity; 5 import android.content.ContentResolver; 6 import android.content.ContentValues; 7 import andr

把一个表中的数据导入到另一个表中

最近,需要对表中的数据进行操作.或者将表中的数据导入到另一张表中,或者将表中的数据生成insert脚本. 假如目标表存在 INSERT INTO 目标表名称 SELECT * FROM 来源表 假如目标表不存在 select * into 目标表名称 from 来源表 直接生成insert语句 select 'insert into 目标表 (字段1,字段2) values ('''+字段1+''','''+字段2+''');' sql_str from 目标表;

MS SQLServer表数据生成Insert语句

关键词:SQLServer.表数据.生成Insert语句 反馈意见请联系:[email protected] 简介 数据库数据生成insert(MSSQL版),可将表中的数据生成insert或者update的sql脚本.比如您维护两个数据库,其中一个数据库中增加的数据也希望能够在另外一个数据中进行执行. 下载地址 下载地址:http://www.vidarsoft.cn/download/SQLInsert.zip Csdn下载地址:http://download.csdn.net/detail

Java千万级别数据生成文件思路和优化

一年前写过一个百万级别数据库数据生成配置xml文件的程序,程序目的是用来把数据库里面的数据生成xml文件.程序可以配置多少文件生成到一个文件中去. 程序刚开始设计的时候说的是最多百万级别数据,最多50W数据生成到一个xml文件里面去,所以在做测试的时候自己也只是造了100W的数据并没有做过多数据量的测试,然后问题就来了....由于程序使用的局点数据量巨大,需要生成xml文件的客户资料接近千万级别的程度,而现场对程序的配置大约是100W条数据生成一个xml文件里面去,程序在这样的大数据量下面偶尔会

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

1.介绍android的数据存储方式 File存储 sharedPrefrence存储方式 conmtentprovider sqlitedatabase 网络存储 2.请介绍下ContentProvider是如何实现数据共享的 安卓中如果想将自己应用程序的数据暴露给其他的应用程序的时候就需要创建内容提供者.第三方可以通过contentResolver来访问该provider 3.为什么要使用ContentProvider?它和sql的实现上有什么差别? ContentProvider屏蔽了数据

用Aspose.Words for .NET动态生成word文档中的数据表格

1.概述 最近项目中有一个这样的需求:导出word 文档,要求这个文档的格式不是固定的,用户可以随便的调整,导出内容中的数据表格列是动态的,例如要求导出姓名和性别,你就要导出这两列的数据,而且这个文档不是导出来之后再调整而是导出来后已经是调整过了的.看到这里,您也许马上想到用模板导出!而且.NET中自带有这个组件:Microsoft.Office.Interop.Word,暂且可以满足需求吧.但这个组件也是有局限性的,例如客户端必须装 office组件,而且编码复杂度高.最麻烦的需求是后面那个-