- 浏览: 108014 次
- 性别:
- 来自: 重庆
最新评论
-
285985787:
谢谢了哈哈
Android 桌面组件【app widget】 进阶项目--心情记录器 -
qingyue0530:
谢谢!
系出名门Android(4) - 活动(Activity), 服务(Service), 广播(Broadcast), 广播接收器(BroadcastReceiv -
changeyouforever:
tks,解决了大问题。
Android下实现wap和net自适应 -
lucane:
LZ,ProgressDialog可不可以动态的在长型进度条和 ...
ProgressDialog -
Soul4:
楼主总结得非常好
Android中Drawable、Bitmap、byte
系出名门Android(9) - 数据库支持(SQLite), 内容提供器(ContentProvider)
介绍
在 Android 中使用 SQLite, ContentProvider
数据库支持(SQLite) - Android 开发平台提供了操作 SQLite 数据库的相关 API
内容提供器(ContentProvider) - 当数据需要在应用程序之间共享时,可以在某程序中使用 ContentProvider 定义 URI, 以使其它应用程序可以通过此 URI 访问指定的数据
1、SQLite 的 Demo
DatabaseHelper.java
代码 package com.webabcd.SQLite; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteDatabase.CursorFactory; // 数据库操作的 Helper 类 public class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context, String name, CursorFactory cursorFactory, int version) { super(context, name, cursorFactory, version); } @Override public void onCreate(SQLiteDatabase db) { // TODO 创建数据库后,对数据库的操作 } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO 更改数据库版本的操作 } @Override public void onOpen(SQLiteDatabase db) { super.onOpen(db); // TODO 每次成功打开数据库后首先被执行 } } Main.java 代码 package com.webabcd.SQLite; import java.util.Random; import android.app.Activity; import android.content.ContentValues; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class Main extends Activity { private DatabaseHelper dbHelper; private static final String DATABASE_NAME = "db.db"; private static final int DATABASE_VERSION = 1; private static final String TABLE_NAME = "employee"; TextView txtMsg; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); dbHelper = new DatabaseHelper(this, DATABASE_NAME, null, DATABASE_VERSION); txtMsg = (TextView) this.findViewById(R.id.txtMsg); Button btn1 = (Button) this.findViewById(R.id.btn1); btn1.setText("创建表"); btn1.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { CreateTable(); } }); Button btn2 = (Button) this.findViewById(R.id.btn2); btn2.setText("插入 3 条记录"); btn2.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { insertItem(); } }); Button btn3 = (Button) this.findViewById(R.id.btn3); btn3.setText("删除全部记录"); btn3.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { deleteItem(); } }); Button btn4 = (Button) this.findViewById(R.id.btn4); btn4.setText("更新指定数据"); btn4.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { updateItem(); } }); Button btn5 = (Button) this.findViewById(R.id.btn5); btn5.setText("显示全部数据"); btn5.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { showItems(); } }); Button btn6 = (Button) this.findViewById(R.id.btn6); btn6.setText("删除表"); btn6.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { dropTable(); } }); } // 创建数据表 private void CreateTable() { SQLiteDatabase db = dbHelper.getWritableDatabase(); String sql = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (ID INTEGER PRIMARY KEY, Name VARCHAR, Age INTEGER);"; try { db.execSQL(sql); txtMsg.append("数据表成功创建\n"); } catch (SQLException ex) { txtMsg.append("数据表创建错误\n" + ex.toString() + "\n"); } } // 插入数据 private void insertItem() { SQLiteDatabase db = dbHelper.getWritableDatabase(); try { Random random = new Random(); for (int i = 0; i < 3; i++) { String sql = "insert into " + TABLE_NAME + " (name, age) values ('name" + String.valueOf(i) + "', " + random.nextInt() + ")"; // execSQL() - 执行指定的 sql db.execSQL(sql); } txtMsg.append("成功插入 3 条数据\n"); } catch (SQLException ex) { txtMsg.append("插入数据失败\n" + ex.toString() + "\n"); } } // 删除数据 private void deleteItem() { try { SQLiteDatabase db = dbHelper.getWritableDatabase(); db.delete(TABLE_NAME, " id < 999999", null); txtMsg.append("成功删除数据\n"); } catch (SQLException e) { txtMsg.append("删除数据失败\n"); } } // 更新数据 private void updateItem() { SQLiteDatabase db = dbHelper.getWritableDatabase(); try { ContentValues values = new ContentValues(); values.put("name", "批量更新后的名字"); db.update(TABLE_NAME, values, "id<?", new String[] { "3" }); txtMsg.append("成功更新数据\n"); } catch (SQLException e) { txtMsg.append("更新数据失败\n"); } } // 查询数据 private void showItems() { SQLiteDatabase db = dbHelper.getReadableDatabase(); try { String[] column = { "id", "name", "age" }; Cursor cursor = db.query(TABLE_NAME, column, null, null, null, null, null); Integer num = cursor.getCount(); txtMsg.append("共 " + Integer.toString(num) + " 条记录\n"); cursor.moveToFirst(); while (cursor.getPosition() != cursor.getCount()) { txtMsg.append(Integer.toString(cursor.getPosition()) + "," + String.valueOf(cursor.getString(0)) + "," + cursor.getString(1) + "," + String.valueOf(cursor.getString(2)) + "\n"); cursor.moveToNext(); } } catch (SQLException ex) { txtMsg.append("读取数据失败\n" + ex.toString() + "\n"); } } // 删除数据表 private void dropTable() { SQLiteDatabase db = dbHelper.getWritableDatabase(); String sql = "DROP TABLE IF EXISTS " + TABLE_NAME; try { db.execSQL(sql); txtMsg.append("数据表删除成功\n"); } catch (SQLException ex) { txtMsg.append("数据表删除错误\n" + ex.toString() + "\n"); } } } 2、ContentProvider 的 Demo MyUser.java 代码 package com.webabcd.contentprovider; import android.net.Uri; import android.provider.BaseColumns; // 自定义 ContentProvider 所需的实体类 public class MyUser { // 必须要有 _id 字段。本例中 BaseColumn 类中已经包含了 _id 字段 public static final class User implements BaseColumns { // 定义 CONTENT_URI public static final Uri CONTENT_URI = Uri.parse("content://com.webabcd.MyContentProvider"); // 表数据列 public static final String USER_NAME = "USER_NAME"; } } MyContentProvider.java 代码 package com.webabcd.contentprovider; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import org.apache.http.util.EncodingUtils; import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.database.Cursor; import android.database.MatrixCursor; import android.net.Uri; // 继承 ContentProvider 以实现自定义的 ContentProvider(基于文件的信息存储) public class MyContentProvider extends ContentProvider { private File file; private FileOutputStream out; private FileInputStream in; // ContentProvider 的删除数据接口 @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // TODO Auto-generated method stub return 0; } @Override public String getType(Uri uri) { // TODO Auto-generated method stub return null; } // ContentProvider 的插入数据接口 @Override public Uri insert(Uri uri, ContentValues values) { try { out = new FileOutputStream(file); out.write(values.getAsString(MyUser.User.USER_NAME).getBytes()); out.close(); int rowId = 0; Uri rowUri = ContentUris.appendId( MyUser.User.CONTENT_URI.buildUpon(), rowId).build(); getContext().getContentResolver().notifyChange(rowUri, null); return rowUri; } catch (Exception e) { return null; } } // 创建用于保存信息的文件 @Override public boolean onCreate() { try { // 每个包中应用程序的私有目录为:/data/data/包名/ // SD 卡目录为:/sdcard file = new File("/data/data/com.webabcd.contentprovider/", "demo.txt"); if (!file.exists()) file.createNewFile(); return true; } catch (Exception ex) { return false; } } // ContentProvider 的查询数据接口 @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { String content; try { in = new FileInputStream(file); int length = (int) file.length(); byte[] buffer = new byte[length]; in.read(buffer, 0, length); content = EncodingUtils.getString(buffer, "UTF-8"); in.close(); String[] columns = new String[] { MyUser.User._ID, MyUser.User.USER_NAME }; MatrixCursor cur = new MatrixCursor(columns); String[] values = new String[] { "0", content }; cur.moveToFirst(); cur.addRow(values); return cur; } catch (Exception e) { return null; } } // ContentProvider 的更新数据接口 @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // TODO Auto-generated method stub return 0; } } Main.java 代码 package com.webabcd.contentprovider; import java.util.Random; import android.app.Activity; import android.content.ContentUris; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.Contacts; import android.provider.Contacts.People; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.Toast; /* * 几个常用的系统内置的 ContentProvider 如下: * content://media/internal/images 这个URI将返回设备上存储的所有图片 * content://contacts/people/ 这个URI将返回设备上的所有联系人信息 * content://contacts/people/45 这个URI返回单个结果(联系人信息中ID为45的联系人记录) */ public class Main extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btn1 = (Button) this.findViewById(R.id.btn1); btn1.setText("新增联系人记录"); btn1.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { Random random = new Random(); insertRecords("name" + String.valueOf(random.nextInt()), String .valueOf(random.nextInt())); } }); Button btn2 = (Button) this.findViewById(R.id.btn2); btn2.setText("查看联系人记录"); btn2.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { displayRecords(); } }); Button btn3 = (Button) this.findViewById(R.id.btn3); btn3.setText("清除联系人记录"); btn3.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { deleteRecords(); } }); Button btn4 = (Button) this.findViewById(R.id.btn4); btn4.setText("更新联系人记录"); btn4.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { // 此处只是演示,id 来自 People._ID ,可参见 displayRecords() 是如何获取 id 的 int id = 0; updateRecord(id, "修改后的name"); } }); Button btn5 = (Button) this.findViewById(R.id.btn5); btn5.setText("新增记录到 MyContentProvider"); btn5.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { insertRecord2MyContentProvider("webabcd"); } }); Button btn6 = (Button) this.findViewById(R.id.btn6); btn6.setText("获取记录从 MyContentProvider"); btn6.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { displayRecord2MyContentProvider(); } }); } // 调用 ContentProvider 的插入接口 private void insertRecords(String name, String phoneNum) { ContentValues values = new ContentValues(); values.put(People.NAME, name); Uri uri = getContentResolver().insert(People.CONTENT_URI, values); Log.d("MyDebug", uri.toString()); Uri numberUri = Uri.withAppendedPath(uri, People.Phones.CONTENT_DIRECTORY); Log.d("MyDebug", numberUri.toString()); values.clear(); values.put(Contacts.Phones.TYPE, People.Phones.TYPE_MOBILE); values.put(People.NUMBER, phoneNum); getContentResolver().insert(numberUri, values); } // 调用 ContentProvider 的查询接口 private void displayRecords() { String[] columns = new String[] { People._ID, People.NAME, People.NUMBER }; Uri contacts = People.CONTENT_URI; Log.d("MyDebug", contacts.toString()); Cursor cur = managedQuery(contacts, columns, // 要返回的数据字段 null, // WHERE子句 null, // WHERE 子句的参数 null // Order-by子句 ); if (cur.moveToFirst()) { String id = null; String name = null; String phoneNo = null; while (cur.getPosition() != cur.getCount()) { id = cur.getString(cur.getColumnIndex(People._ID)); name = cur.getString(cur.getColumnIndex(People.NAME)); phoneNo = cur.getString(cur.getColumnIndex(People.NUMBER)); Toast.makeText(this, id + " / " + name + " / " + phoneNo, Toast.LENGTH_SHORT).show(); cur.moveToNext(); } } } // 调用 ContentProvider 的删除接口 private void deleteRecords() { Uri uri = People.CONTENT_URI; Log.d("MyDebug", uri.toString()); getContentResolver().delete(uri, null, null); // getContentResolver().delete(uri, "NAME=" + "'name'", null); } // 调用 ContentProvider 的更新接口 private void updateRecord(int recordNo, String name) { Uri uri = ContentUris.withAppendedId(People.CONTENT_URI, recordNo); Log.d("MyDebug", uri.toString()); ContentValues values = new ContentValues(); values.put(People.NAME, name); getContentResolver().update(uri, values, null, null); } // 调用自定义 ContentProvider 的插入接口 private void insertRecord2MyContentProvider(String name) { ContentValues values = new ContentValues(); values.put(MyUser.User.USER_NAME, name); getContentResolver().insert(MyUser.User.CONTENT_URI, values); } // 调用自定义 ContentProvider 的查询接口 private void displayRecord2MyContentProvider() { String[] columns = new String[] { MyUser.User.USER_NAME }; Uri uri = MyUser.User.CONTENT_URI; Cursor cur = managedQuery(uri, columns, null, null, null); while (cur.getPosition() != cur.getCount()) { String id = cur.getString(cur.getColumnIndex(People._ID)); String name = cur.getString(cur.getColumnIndex(MyUser.User.USER_NAME)); Toast.makeText(this, id + " / " + name, Toast.LENGTH_SHORT).show(); cur.moveToNext(); } } } AndroidManifest.xml 代码 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.webabcd.contentprovider" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".Main" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 配置一个自定义的 ContentProvider" --> <provider android:name="MyContentProvider" android:authorities="com.webabcd.MyContentProvider" /> </application> <uses-permission android:name="android.permission.WRITE_CONTACTS"></uses-permission> <uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission> <uses-sdk android:minSdkVersion="3" /> </manifest>
相关推荐
SQLite是一个轻量级的、关系型的数据库管理系统,它被嵌入到Android系统中,为应用程序提供数据存储功能,无需额外安装服务器。本教程将深入讲解如何在Android中使用SQLite数据库进行基本的增删改查操作。 首先,...
wvp-GB28181-pro 适配支持 SQlite3 数据库 支持wvp-GB28181-pro 2.6.9
这是基于android开发的学生信息管理系统,包括学生的增加、...除此之外,该系统应用到了手机内置的sqlite数据库来进行数据的存储,所以,是学生学习android的一次不错的选择,应用工具androidStudio,编写语言,java
android-database-sqlcipher-4.4.0和sqlite-2.1.0 官网下载太慢了,还总是下不下来,终于下载下来就分享出来。 安装清参考博客:https://blog.csdn.net/zdwcmy/article/details/106990422
而gwc-sqlite-plugin则是将这种缓存能力扩展到了SQLite数据库,这是一种轻量级、文件式的数据库,无需独立的服务器进程,适合于移动设备或资源有限的环境。 在提供的压缩包中,有四个重要的文件: 1. **sqlite-...
在Android开发中,SQLite是一个非常重要的组成部分,它是一个轻量级的、开源的、嵌入式的SQL数据库引擎,被广泛用于存储和管理应用程序中的数据。SQLite具有高效、可靠且易于集成的特点,使得它成为Android应用数据...
Android学习笔记-SQLite介绍-以及使用Sqlite-进行数据库的创建-完成数据.pdf
这个压缩包文件"Android源码——数据库SQLite.zip"可能包含了关于Android中SQLite数据库的源码分析、使用示例以及相关的图像资源,如1-120912223R80-L.png,可能用于解释或展示SQLite在Android中的工作原理。...
标题"安卓SQLite数据库相关-安卓Androidsqlite万能数据库.rar"暗示了这个压缩包包含了一系列与Android平台上SQLite数据库使用相关的资源,可能是源代码、教程、示例或者其他工具。由于描述中提到“太多无法一一验证...
在Android开发中,SQLite是一个至关重要的组件,它是一个轻量级的、无服务器进程的数据库系统,特别适合嵌入式设备。SQLite具有ACID特性,保证了数据在各种操作中的完整性和一致性。它支持五种基本数据类型:NULL、...
`sqlite-android`是一个针对Android平台的SQLite支持库,它提供了更便捷的方式来与SQLite数据库交互,尤其在ORM(对象关系映射)框架中,可以极大地简化开发者的工作。 ORM框架允许开发者以面向对象的方式处理数据...
Android 数据库 SQLite 的简单示例 Android 中提供了三种数据存储方式,分别是文件存储、SharedPreferences 存储和数据库 SQLiteDatabase 存储。文件存储和 SharedPreferences 存储已经在之前的文章中进行了详细的...
SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库不一样,您不需要在系统中配置。 就像其他数据库,SQLite 引擎不是一个...
使用sqlite数据库本地缓存
Android下SQLite数据库安全机制的设计与实现,刘树杰,,Android 作为强大的智能终端操作系统,深受用户的喜爱,基于该平台的应用日益增多。Android平台下提供了SQLite 数据库作为数据存储的主��
在Android平台上,SQLite是一个常用的轻量级关系型数据库,它被集成到系统中,用于存储应用程序的数据。在Android应用开发中,SQLite数据库是通过Java API进行操作的,但有时为了性能提升或者特定功能的实现,开发者...
SQLite是一个轻量级、关系型数据库管理系统,被广泛应用于移动设备,包括Android。本篇将详细讲解如何在Android应用中使用SQLite存储数据以及如何在SDCard(外部存储)上创建数据库。 首先,我们需要在Android项目...
首先,我们要了解的是 `sqlite.js` 文件,这是一个自封装的 SQLite 库,它提供了一系列与 SQLite 交互的方法,如打开数据库、关闭数据库、创建表、删除表、插入数据、删除数据以及查询和更新数据等。封装的好处是让...
"Node.js-better-sqlite3是Node.js中最快和最简单的SQLite3库" 这个标题表明我们关注的是一个名为`better-sqlite3`的库,它是针对Node.js平台的SQLite3数据库接口。这个库以其速度和易用性著称,适合在Node.js环境中...
"基于ARM-Linux实现SQLite嵌入式数据库" 本文将对基于ARM-Linux实现SQLite嵌入式数据库进行详细的分析和讨论。首先,我们将介绍Linux下的常见数据库技术,然后讨论嵌入式系统开发中对数据库的需求特点,接着对...