`
wang7839186
  • 浏览: 42063 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android之sqliteDatabase,sqliteOpenHelper,ContentProvider

阅读更多

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

简单的使用方法我们已了解,那么,我们来分析一下复杂的内容。

分享到:
评论

相关推荐

    SQLiteOpenHelper和ContentProvider区别

    ContentProvider是Android四大组件之一,它提供了一种标准的方式来存储和检索数据,并且使得不同应用之间能够安全地共享数据。ContentProvider通过URI(Uniform Resource Identifier)来标识和访问数据,每个URI对应...

    Android应用开发使用ContentProvider以及SQLite实现对数据库的相关操作

    接下来,ContentProvider是Android四大组件之一,它提供了一种标准接口,使得其他应用程序可以访问和修改由ContentProvider管理的数据,无论这些数据是存储在SQLite数据库、文件系统还是网络中。要创建一个...

    android 数据库 以及自定义ContentProvider demo

    ContentProvider是Android四大组件之一,它使得数据能在不同应用间共享。创建自定义ContentProvider需要继承ContentProvider类,并实现其关键方法,如query(), insert(), update(), delete()和getType()。 以下是一...

    android 项目利用SQLiteOpenHelper创建数据库文件Demo

    在这个“android项目利用SQLiteOpenHelper创建数据库文件Demo”中,我们将深入探讨如何在Android应用中有效地使用SQLiteOpenHelper。 首先,我们需要了解SQLiteOpenHelper的基本结构。一个典型的SQLiteOpenHelper...

    android对sqlite、contentprovider的例子

    在 Android 中,我们通常通过 `SQLiteOpenHelper` 类来管理数据库的版本和生命周期,同时使用 `SQLiteDatabase` 对象执行 SQL 命令。 1. **创建数据库**:首先,你需要继承 `SQLiteOpenHelper` 类并重写 `onCreate...

    Android四大组件之ContentProvider:简单的通讯录查询和添加

    在Android系统中,四大组件是应用程序的核心...理解并熟练掌握ContentProvider的使用,是每个Android开发者必备的技能之一。在实际开发中,可以根据需求定制自己的ContentProvider,实现更复杂的数据管理和交互功能。

    Android SqliteOpenHelper数据库的基本使用

    本篇主要介绍如何使用Android内置的`SQLiteOpenHelper`类来操作SQLite数据库,包括创建数据库、升级数据库、执行增删改查(CRUD)操作等核心知识点。 ### 1. 数据库初始化与创建 `SQLiteOpenHelper`是Android提供...

    contentprovider实现数据库访问

    在Android开发中,ContentProvider是四大组件之一,它扮演着数据共享和访问的重要角色。ContentProvider使得应用程序可以将自己的数据结构化,并提供给其他应用进行安全的读写操作,包括增、删、改、查等基本功能。...

    Pro-Android-3 BookProvider SQLiteOpenHelper

    `BookProvider`是自定义的内容提供者(Content Provider),它是Android四大组件之一,用于在应用程序之间共享数据;而`SQLiteOpenHelper`则是Android提供的一个辅助类,方便开发者操作SQLite数据库。 首先,我们来...

    android 通过ContentProvider实现sqlite数据库共享

    `ContentProvider`是Android四大组件之一,它的主要作用是提供一个统一的接口,使得其他应用程序能够访问和操作私有的数据,如文件、数据库等。`ContentProvider`通过URI(统一资源标识符)来定位数据,并通过`...

    ContentProvider操作数据库小例子

    在Android开发中,ContentProvider是一种系统级别的服务,用于在应用程序之间共享数据。它扮演着数据桥梁的角色,使得不同应用能够安全、有效地访问彼此的数据。在这个小例子中,我们将深入理解如何利用...

    Android 自定义ContentProvider简单实例

    "Android 自定义ContentProvider简单实例" Android 自定义ContentProvider简单实例主要介绍了Android 自定义ContentProvider简单实例的相关资料,需要的朋友可以参考下。Android 允许我们定义自己的ContentProvider...

    自定义ContentProvider完成数据交互

    在Android系统中,ContentProvider是四大组件之一,用于在应用程序之间共享数据。它提供了一种标准的接口,使得不同应用可以安全地访问和操作其他应用的数据,而无需暴露具体的数据库或者文件系统细节。本篇文章将...

    ContentProvider单个数据库表

    在Android开发中,ContentProvider是四大组件之一,它充当了数据共享的角色,使得不同应用程序间可以安全地访问和操作数据。本示例着重讲解如何创建一个针对单一数据库表的ContentProvider,帮助初学者理解其工作...

    ContentProvider

    import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import android.content.UriMatcher; import android....

    安卓开发实验6——SQLite和SQLiteDatabase应用

    在本实验“安卓开发实验6——SQLite和SQLiteDatabase应用”中,我们将深入学习如何在Android应用程序中集成SQLite数据库来存储和检索数据,特别是新闻信息。我们将使用ListView组件来动态地展示这些新闻内容,提供...

    Android四种存储方式 sharedpreference,file,SQlite,contentprovider

    Android提供了四种主要的数据存储方式:SharedPreferences、文件存储、SQLite数据库和ContentProvider。以下是对这四种存储方式的详细介绍,以及如何在Android中实现数据库和表的创建、增删改查操作。 1. **...

    安卓ContentProvider详解例程

    在Android开发中,ContentProvider是四大组件之一,它扮演着数据共享和访问的重要角色。ContentProvider使得应用程序可以将自己的数据结构化,并提供给其他应用进行安全的读写操作。本例程将带你深入理解如何创建和...

    sqlite&provider&observer

    SQLiteDatabase,SQLiteOpenHelper,ContentProvider,ContentResolver,ContentObserver,ContentObserverable的使用简单使用。

Global site tag (gtag.js) - Google Analytics