`

Android (SQLite 数据库与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;
    }
 

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


分享到:
评论

相关推荐

    实验8 SQLite数据库与ContentProvider.doc

    SQLite数据库与ContentProvider实验报告 随着移动设备的普及,移动应用程序的开发也变得越来越重要。在移动应用程序开发中,数据存储是非常重要的一部分,SQLite数据库是Android操作系统中常用的数据库管理系统。本...

    android sqlite数据库 demo code

    在"android sqlite数据库 demo code"中,我们可以看到一个简单的Android应用示例,该示例演示了如何使用SQLite数据库进行数据的增删改查操作。下面将详细介绍这些关键知识点: 1. **SQLiteOpenHelper**: 这是...

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

    ContentProvider则是Android框架提供的一种机制,用于在应用程序之间共享数据,同时也可用于管理SQLite数据库。接下来,我们将深入探讨如何使用ContentProvider和SQLite在Android应用中执行数据库操作。 首先,...

    Android数据库SQLite详解

    - **加密**: 可以使用第三方库对SQLite数据库进行加密,增强数据安全性。 - **索引**: 为经常用于查询的字段创建索引,提高查询速度。 - **批量操作**: 避免频繁的单条数据操作,尽量使用批处理来提升性能。 - **...

    android sqlite数据库实例

    此外,为了提高性能和用户体验,我们还可以使用`ContentProvider`、`LiveData`和`Room Persistence Library`等高级特性,它们能更好地管理和异步处理数据库操作,以及与Android系统的其他部分进行集成。 总结来说,...

    Android SQLite数据库操作demo

    本篇将基于一个名为"Android SQLite数据库操作demo"的示例项目,探讨如何在Android中进行SQLite数据库的相关操作。原作者的博客地址为http://blog.csdn.net/liuhe688/article/details/6715983。 首先,我们来看一下...

    android对sqlite、contentprovider的例子

    在提供的压缩包文件中,可能包含了一个名为 "db" 的数据库文件,这可能是应用运行过程中SQLite数据库的备份或者导出。分析这个文件,你可以了解应用是如何组织和存储数据的。通常,你可以使用一些数据库查看工具,如...

    Android SQLite数据库应用

    3. **ContentProvider与SQLite数据库** - **ContentProvider**:它是Android系统中用于数据共享的接口,通过实现ContentProvider,其他应用可以访问我们的SQLite数据库。这对于跨应用数据交换非常有用。 - **Uri与...

    arcgis for android 读取加载sqlite数据库.rar

    本教程将探讨如何在ArcGIS for Android环境中利用SQLite数据库进行数据存储和读取。 1. **SQLite数据库介绍**: SQLite是一个自包含、无服务器、零配置、事务性的SQL数据库引擎,无需额外的数据库管理器进程,直接...

    android对sqlite数据库的操作

    在更复杂的场景下,应用间共享数据时,可以使用`ContentProvider`结合SQLite数据库,实现数据的统一管理和访问。 九、LiveData和Room库 Android架构组件中的`LiveData`和`Room`提供了更好的数据库操作体验。`Room`...

    android Sqlite数据库操作demo

    在这个"android Sqlite数据库操作demo"中,我们可以深入理解如何在Android应用中进行SQLite的增删改查操作。 首先,我们需要在Android项目中创建一个SQLite数据库。这通常通过继承SQLiteOpenHelper类来实现。...

    android 操作sqlite数据库源码

    下面我们将深入探讨如何使用Android操作SQLite数据库,并基于提供的"android 操作sqlite数据库源码"进行讲解。 1. **SQLiteOpenHelper**: `DataBaseHelper`这个类名暗示它是对SQLiteOpenHelper的一个实现。...

    Android操作SQLite数据库Demo

    Android官方推荐使用Room库来处理SQLite数据库,它提供了类型安全的API,并与Android的Lifecycle组件良好集成。LiveData是响应式数据持有者,可确保数据在生命周期内正确更新,非常适合与Room搭配使用。 9. **...

    android操作数据库Sqlite源代码

    在Android开发中,SQLite是一个非常重要的组成部分,它是一个轻量级的数据库系统,适用于移动设备。SQLite被集成在Android操作系统中,...学习并理解这些知识点,将有助于你更好地在Android项目中运用SQLite数据库。

    android SQLite数据库存储

    5. **ContentProvider**:虽然不是必需的,但为了与其他应用共享数据或者遵循Android的数据访问最佳实践,可以使用`ContentProvider`封装对SQLite数据库的操作。 6. **Cursor对象**:在查询数据库后,返回的结果...

    Android SQLite数据库的使用.zip

    本实验项目旨在帮助开发者理解和掌握Android环境下SQLite数据库的基本操作,包括创建数据库、创建表、插入数据、查询数据、更新数据以及删除数据等。 首先,我们来了解一下如何在Android Studio中创建SQLite数据库...

    Android源码——数据库SQLite.zip

    最后,文件名"1-120912223R80-L.png"可能是用来辅助说明的图表,可能展示了SQLite数据库的结构、查询流程图或者是Android中与SQLite交互的代码示例。 总的来说,"Android源码——数据库SQLite.zip"的内容涵盖了...

    android 创建数据库contentprovider

    `android 创建数据库contentprovider`这个主题主要涉及如何创建一个自定义的ContentProvider来管理数据库中的数据,并实现跨应用的数据共享。以下是对这个主题的详细阐述: 一、ContentProvider概述 ...

    android sqlite数据库 demo

    同时,还可以利用`ContentProvider`将SQLite数据库的数据暴露给其他应用,实现数据共享。 总的来说,SQLite是Android开发中处理本地数据不可或缺的工具。通过理解并熟练运用SQLite数据库,开发者可以构建功能丰富的...

    实验项目报告第7章.doc android studio SQLite数据库的创建、增删改查操作 SharedPreferen

    【Android Studio 中 SQLite 数据库操作】 在 Android 开发中,SQLite 是一个常用的数据存储解决方案,尤其适合小型到中型的数据存储需求。SQLite 是一个轻量级的、嵌入式的关系型数据库,支持标准的 SQL 语法,...

Global site tag (gtag.js) - Google Analytics