`
童梦新苑
  • 浏览: 41017 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

ContentProvider

阅读更多

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

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必须重载并实现,

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;
 }
}


 

再创建一个使用者(消费者)

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;
    }
}

 在来看看使用ContentProvider

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;
    }

 

分享到:
评论
1 楼 缺氧小老鼠 2011-09-15  
[color=red][/color][size=xx-large][/size][align=center][/align][b][/b][i][/i][u][/u]
引用

    [*]
[img][/img][url][/url][flash=200,200][/flash]

相关推荐

    Android+Room+ContentProvider

    在Android应用开发中,数据持久化是一个至关重要的环节,而Android Room和ContentProvider是其中的两个关键组件。本文将深入探讨这两个技术,并结合实际案例,解释如何在Android应用中使用它们来管理和共享SQLite...

    android 用ContentProvider操作文件

    在Android系统中,ContentProvider是一种核心组件,它允许应用程序之间共享数据,而无需直接访问对方的内部存储。在本教程中,我们将深入探讨如何利用ContentProvider来操作文件,以及其在跨应用数据传输中的作用。 ...

    androdi ContentProvider和Uri详解

    在Android开发中,ContentProvider和Uri是两个至关重要的概念,它们是Android系统中不同应用程序间数据共享和交互的基础。本文将深入探讨这两个组件的工作原理、使用方法以及它们在实际开发中的应用。 首先,我们来...

    两个apk之间广播互相通信及ContentProvider监听数据库的变换

    本教程将深入探讨如何利用Broadcast和ContentProvider实现两个apk之间的通信以及ContentProvider对数据库变更的监听。 首先,我们来理解Broadcast(广播)的概念。Broadcast是Android系统中一种全局的通知机制,...

    Android实现使用自定义ContentProvider共享生词本数据库

    Android高级编程雪梨作业之自定义ContentProvider 将任务01生词本作业中生成的生词本数据库通过自定义ContentProvider的方式,共享给其他应用。 要求如下: (1) 使用自定义SQLiteOpenHelper来管理数据库; (2) 提交...

    contentprovider

    ContentProvider是Android系统中的四大组件之一,它是Android应用程序间数据共享的主要机制。通过ContentProvider,一个应用可以将自己的数据暴露给其他应用,同时也能够访问其他应用公开的数据。在Android的封闭...

    ContentProvider多表创建

    在Android系统中,ContentProvider是实现数据共享和跨应用数据访问的重要组件。它遵循统一的URI(Uniform Resource Identifier)机制,使得不同的应用可以方便地读取和修改存储在ContentProvider中的数据。本教程将...

    ContentProvider使用方法demo

    ContentProvider是Android系统中用于数据共享的一个核心组件,它允许应用程序之间进行数据交换,而无需了解对方的具体实现。本教程将深入讲解ContentProvider的使用方法,包括基础操作、多ContentProvider管理和多表...

    android 自定义 ContentProvider 以及 ContentResolver

    在Android开发中,ContentProvider和ContentResolver是两个关键组件,它们构成了Android系统中不同应用程序间数据共享的基础。本文将深入探讨如何自定义ContentProvider和如何有效地使用ContentResolver进行数据操作...

    安卓学习之ContentProvider初步

    ContentProvider是Android系统中用于数据共享的重要组件,它是不同应用程序之间安全地交换数据的桥梁。当你想要在自己的应用中公开数据,允许其他应用进行访问时,就需要使用ContentProvider。虽然在许多情况下,...

    ContentProvider自定义以及使用系统ContentProvider

    在Android开发中,ContentProvider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序间可以安全地访问和操作数据。本篇文章将深入探讨如何自定义ContentProvider以及如何使用系统提供的ContentProvider。 ...

    android contentprovider使用示例

    在Android开发中,ContentProvider是四大组件之一,它充当了数据共享的桥梁,使得不同的应用程序之间可以安全地访问和操作数据。本示例将详细解释如何在Android中使用ContentProvider。 1. **ContentProvider基本...

    ContentProvider 实战源码以及apk

    在Android开发中,ContentProvider是四大组件之一,它扮演着数据共享和跨应用数据访问的角色。本实战源码深入解析了ContentProvider的工作原理及其在实际项目中的应用,通过阅读源码,开发者可以更好地理解如何创建...

    用SharePreferences做ContentProvider

    `SharedPreferences` 和 `ContentProvider` 是两种常见的数据存储和共享机制。本篇文章将深入探讨如何利用 `SharedPreferences` 作为数据存储,并通过实现 `ContentProvider` 来实现不同应用间的数据共享。 `...

    android 创建数据库contentprovider

    在Android系统中,ContentProvider是一种重要的组件,它允许应用程序之间共享数据。`android 创建数据库contentprovider`这个主题主要涉及如何创建一个自定义的ContentProvider来管理数据库中的数据,并实现跨应用的...

    ContentProvider获取系统的图片视频和音频

    在Android系统中,ContentProvider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序之间可以安全地访问和操作彼此的数据。本篇文章将详细讲解如何使用ContentProvider通过ContentResolver来获取系统的图片...

    contentProvider监听的例子

    在Android开发中,ContentProvider是系统提供的一种数据共享机制,它允许不同的应用之间进行数据交换。ContentProvider基于URI(统一资源标识符)进行操作,通过ContentResolver接口与ContentProvider进行通信。本...

Global site tag (gtag.js) - Google Analytics