http://www.rom007.com/SQLite-yu-ContentProvider.html

在Android中,对于数据的存贮,有几种方式,有文件方式,有文件式数据库方式,Android自带了一个SQLite数据库,做嵌入开发的人对这个跨平台的本地文件数据库一定不会陌生,在Android对于数据的访问,提出了新的方式,ContentProvider方式,类似于MS的ContentProvider方式的,OLEDB,及ODBC统一的数据方式。
我们首先来看看SQLite在
Android中的使用,在Android中有最简单的使用方式,就是利Context对象的openorCreateDatabase
我们来看看一段代码:

package test.DB;

import android.app.Activity;
import android.content.Intent;
import
android.database.Cursor;
import
android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import
android.view.Menu;
import android.view.MenuItem;
import
android.widget.TextView;

public class DBActivity extends Activity {
private SQLiteDatabase mdb =
null;
    /** Called when the activity is first created. */
   
@Override
    public void onCreate(Bundle savedInstanceState) {
       
super.onCreate(savedInstanceState);
        initDatabase();
       
setContentView(R.layout.main);      
    }
    @Override
public
boolean onCreateOptionsMenu(Menu menu) {
  // TODO Auto-generated method
stub
  super.onCreateOptionsMenu(menu);  
  menu.add(1, Menu.FIRST +1, 1,
“GetName”); 
  menu.add(1, Menu.FIRST +2, 2, “Test”);  
  return true; 

}
    public boolean onOptionsItemSelected(MenuItem item) {
  // TODO
Auto-generated method stub
  super.onOptionsItemSelected(item);
  switch
(item.getItemId())
  {
   case Menu.FIRST+ 1:
   {
    TextView tv =
(TextView)this.findViewById(R.id.view_main);
   
tv.setText(this.getName());
    break;
   }
   case Menu.FIRST +
2:
   {
    this.setTitle(“Del Item…”);
    break;
   }  
 
}
  return true;
}
    private void initDatabase()
    {
     mdb
= this.openOrCreateDatabase(“dbfile”, 0, null);
     String sql_create =
“create table test (id int, name TEXT)”;
    
mdb.execSQL(sql_create);
     String sql_insert = “insert into test(id, name)
values(3, ‘name3′)”;
     mdb.execSQL(sql_insert);
    }
    private
String getName()
    {
     String name = null;
     Cursor cur =
mdb.rawQuery(“select * from test”, null);
     cur.moveToFirst();
    
while (!cur.isLast())
     {
      name = name  + cur.getString(1)+
“\r\n”;
      cur.moveToNext();
     }
     return name;
   
}
}
我们再来看看单独使用SQLiteOpenHelper方式:
先由SQLiteOpenHelper继承一个数据库操作类,其中onCreate,
onUpgrade必须重载并实现,

package test.DB;

import android.content.Context;
import android.database.Cursor;
import
android.database.sqlite.SQLiteDatabase;
import
android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHelper extends SQLiteOpenHelper {
@Override
public
void onCreate(SQLiteDatabase db) {
  // TODO Auto-generated method stub 

}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion,
int newVersion) {
  // TODO Auto-generated method stub 
}
public
DatabaseHelper(Context ct,String dbName)
{
  super(ct,dbName,null,1); 

}
public boolean insert(String insert)
{
 
this.getWritableDatabase().execSQL(insert);
  return true;
}
public
boolean update(String update)
{
 
this.getWritableDatabase().execSQL(update);
  return true;
}
public
boolean delete(String del)
{
 
this.getWritableDatabase().execSQL(del);
  return true;
}
public Cursor
query(String query)
{
  Cursor cur =
this.getReadableDatabase().rawQuery(query, null);
  return
cur;
}
}
再创建一个使用者(消费者)

package test.DB;

import android.app.Activity;
import android.content.Intent;
import
android.database.Cursor;
import
android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import
android.view.Menu;
import android.view.MenuItem;
import
android.widget.TextView;

public class DBActivity extends Activity {
private SQLiteDatabase mdb =
null;
private DatabaseHelper helper = null;
    /** Called when the
activity is first created. */
    @Override
    public void
onCreate(Bundle savedInstanceState) {
       
super.onCreate(savedInstanceState);
        initDatabase();
       
setContentView(R.layout.main);      
    }
    @Override
public
boolean onCreateOptionsMenu(Menu menu) {
  // TODO Auto-generated method
stub
  super.onCreateOptionsMenu(menu);  
  menu.add(1, Menu.FIRST +1, 1,
“GetName”); 
  menu.add(1, Menu.FIRST +2, 2, “Test”);  
  return true; 

}
    public boolean onOptionsItemSelected(MenuItem item) {
  // TODO
Auto-generated method stub
  super.onOptionsItemSelected(item);
  switch
(item.getItemId())
  {
   case Menu.FIRST+ 1:
   {
    TextView tv =
(TextView)this.findViewById(R.id.view_main);
   
tv.setText(this.getName());
    break;
   }
   case Menu.FIRST +
2:
   {
    this.setTitle(“Del Item…”);
    break;
   }  
 
}
  return true;
}
    private void initDatabase()
    {
    
helper = new DatabaseHelper(this,”dbfile”);
     //mdb =
this.openOrCreateDatabase(“dbfile”, 0, null);
     //String sql_create =
“create table test (id int, name TEXT)”;
    
//mdb.execSQL(sql_create);
     String sql_insert = “insert into test(id,
name) values(55, ‘namexx’)”;
     //mdb.execSQL(sql_insert);
    
helper.insert(sql_insert);
    }
    private String getName()
   
{
     String name = null;
     //mdb =
helper.getReadableDatabase();
     Cursor cur = helper.query(“select * from
test”);
     cur.moveToFirst();
     do
     {
      name = name  +
cur.getString(1)+ “\n”;     
     } while(cur.moveToNext());     
    
return name;
    }
}

这些代码读起来是不是有点Visual
Basic的感觉?呵呵,所以,以后说不定.net,Android,java,blackberry,最终都成为一致的API,当然,这只是我们的期望,这样大家不必整天花这么多时间学这些无聊的接口了。
好了,该我们的ContentProvider出场了,与Service,BroadcastReceiver等组件一样,继承特定的Interface,在AndroidManifest.xml里声明这个ContentProvider,调用者就可以拿来使用了。
首先我们定义一个ContentProvider:

package test.DB;

import android.content.ContentProvider;
import
android.content.ContentValues;
import android.database.Cursor;
import
android.net.Uri;
import android.widget.Toast;

public class TestProvider extends ContentProvider {
    private
DatabaseHelper mdbHelper = null;
    final static String TABLE_NAME =
“test”;
@Override
public int delete(Uri arg0, String arg1, String[] arg2)
{
  mdbHelper.getWritableDatabase().delete(TABLE_NAME, arg1, arg2);
 
return 0;
}

@Override
public String getType(Uri uri) {
  // TODO Auto-generated
method stub
  return null;
}

@Override
public Uri insert(Uri uri, ContentValues values) {
  // TODO
Auto-generated method stub
 
mdbHelper.getWritableDatabase().insert(TABLE_NAME, “”, values);
  return
null;
}

@Override
public boolean onCreate() {
  // TODO Auto-generated method
stub
  mdbHelper = new DatabaseHelper(this.getContext(), “dbfile”);
 
return true;
}

@Override
public Cursor query(Uri uri, String[] projection, String
selection,
   String[] selectionArgs, String sortOrder) {
  Cursor cur =
mdbHelper.getReadableDatabase().query(TABLE_NAME,projection,selection,null,null,null,
null);
  Toast.makeText(this.getContext(), “test Cur!”,
Toast.LENGTH_SHORT);
  return cur;
}

@Override
public int update(Uri uri, ContentValues values, String
selection,
   String[] selectionArgs) {
 
mdbHelper.getWritableDatabase().update(TABLE_NAME, values, selection,
null);
  return 0;
}

}

老规矩,AndroidManifest.xml来定义这个Provider
<provider
android:label=”test_provider” android:authorities=”com.my.provider”
android:name=”TestProvider”>
   
</provider>
这里的
android:authorities
=
“com.my.provider”是标识这个ContentProvider,调用者可以根据这个标识来找到它,
我们组合一个能找到它的Uri,
public
class ProviderConst {
public static final Uri MY_TEST_URI =
Uri.parse(“content://com.my.provider/test”);

}

content
指的是内容提供者ContentProvider。
//com.my.provider映射到我们已定义的那个ContentProvider标识
/test这个作为一个参数,传给ContentProvider,可以根据这个参数来决定操作目标,比如数据库中的哪张表,文件中的那一部分数据等。
我们来操作这个内容提供者:
private
String getName()
    {
     String name = null;    
     Cursor cur =
this.getContentResolver().query(ProviderConst.MY_TEST_URI,new
String[]{“id”,”name”},null, null, null);
     if (cur == null)
     
return null;
     cur.moveToFirst();
     do
     {
      name =
name  + cur.getString(1)+ “\n”;     
     } while(cur.moveToNext());     

     return name;
    }
我们也可以这样使用:
private String getName()
   
{
     String name = null;    
     Cursor cur =
this.managedQuery(ProviderConst.MY_TEST_URI,new String[]{“id”,”name”},null,
null, null);
     if (cur == null)
      return null;
    
cur.moveToFirst();
     do
     {
      name = name  +
cur.getString(1)+ “\n”;     
     } while(cur.moveToNext());     
    
return name;
    }

SQLite与ContentProvider的更多相关文章

  1. 简单的学习心得:网易云课堂Android开发第六章SQLite与ContentProvider

    一.SQLite 1.基本操作: (1)创建数据库:在SQLiteOpenHelper的子类构造器中创建. (2)创建表:在SQLiteOpenHelper的子类onCreate方法中,调用execS ...

  2. Android中操作数据的集中方式---文件,SQLite,ContentProvider

    http://blog.csdn.net/he90227/article/details/33734239 转

  3. Android开发(二十四)——数据存储SharePreference、SQLite、File、ContentProvider

    Android提供以下四种存储方式: SharePreference SQLite File ContentProvider Android系统中数据基本都是私有的,一般存放在“data/data/程 ...

  4. Android 存储(本地存储 SD卡存储 SharedPreference SQLite ContentProvider)

    本文出自:http://blog.csdn.net/dt235201314/article/details/73176149 源码下载欢迎Star(updating):https://github.c ...

  5. Android ContentProvider基本用法

    转自:https://www.jianshu.com/p/601086916c8f 一.基本概念 ContentProvider是Android系统中提供的专门用户不同应用间进行数据共享的组件,提供了 ...

  6. 独立开发 一个社交 APP 的架构分享 (已实现)

    (本博客为原创:http://www.cnblogs.com/linguanh/)   My BananaCloud Android Application 前言:  这算是我的第一个 完完全全 由自 ...

  7. Android 基础篇(二)

    ADB进程 adb指令 adb install xxx.apk adb uninstall 包名 adb devices adb start-server adb kill-server adb sh ...

  8. Android高手速成--第二部分 工具库

    主要包括那些不错的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容.多媒体相关及其他. 一.依赖注入DI 通过依赖注入减少Vie ...

  9. Android开源项目分类汇总

    目前包括: Android开源项目第一篇——个性化控件(View)篇   包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView. ...

随机推荐

  1. kubeadm快速部署Kubernetes单节点

    1. 安装要求 在开始之前,部署Kubernetes集群机器需要满足以下几个条件: 一台或多台机器,操作系统 CentOS7.x-86_x64 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬 ...

  2. 使用ramdisk内存分区给常用软件加速

    ::参考内存盘软件https://download.csdn.net/download/zly6tz/9717137cls @echo off ::内存虚拟盘符-内存盘大小自己查看源目录大小 ::下面 ...

  3. Alpha冲刺报告(9/12)(麻瓜制造者)

    今日已完成 邓弘立: 正在进行主页逻辑的编写 符天愉: 部署商品发布和物品需求的接口 江郑: 尝试完善接口文档,进行进一步测试 刘双玉: 编写接口说明 肖小强: 进行逻辑模块的编写 李佳铭: 修改了U ...

  4. [python]pip 版本9.0.1升级到10.0.1故障解决办法

    问题背景: 在做android自动化时使用到第三方库uiautomator时,提示要安装,但安装该uiautomator库时提示当前的pip版本偏低,需要安装10.0.1版本方可.但在升级到升级到该版 ...

  5. saltstack二次开发(三)

    以下代码实现的功能: 通过saltstack的httpapi在minion上安装软件. vim saltapi.py #!/usr/bin/env python # -*- coding: utf-8 ...

  6. 【转】浅谈一个网页打开的全过程(涉及DNS、CDN、Nginx负载均衡等)

    1.概要 从用户在浏览器输入域名开始,到web页面加载完毕,这是一个说复杂不复杂,说简单不简单的过程,下文暂且把这个过程称作网页加载过程.下面我将依靠自己的经验,总结一下整个过程.如有错漏,欢迎指正. ...

  7. jmeter测试webservice接口

    webservice怎样使用jmeter测试呢? 测试样例url=http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx ...

  8. 解决Win10家庭版没有‘本地用户和组’问题

    今天偶然发现我的win10系统是家庭版,并且没有本地用户和组. 处理方法:将系统升至为win10专业版,然后下载microKMS_v17.02.14做的激活.参考网站 1.打开运行窗口,输入 gped ...

  9. 微信小程序开发 [02] 页面注册和基本组件

    1.页面注册 既然我们希望跳转到新的页面,那自然要新建页面相关的文件才行.在开篇已经讲过,一个小程序页面由四个文件组成,假如我们的页面名为welcome,那么这四个文件则是: welcome.js w ...

  10. 【H5】dropload (移动端下拉刷新,上拉加载)

    插件概要地址:http://ximan.github.io/dropload/ 一般下载其中的demo2对照修改即可使用. 小吐槽.我在项目中用的时候,有个后端说ajax麻烦但是还是要做体现他很热爱工 ...