系出名門Android(9) - 數(shù)據(jù)庫支持(SQLite), 內容提供器(ContentProvider)
作者:webabcd
介紹
在 Android 中使用 SQLite, ContentProvider
數(shù)據(jù)庫支持(SQLite) - Android 開發(fā)平臺提供了操作 SQLite 數(shù)據(jù)庫的相關 API
內容提供器(ContentProvider) - 當數(shù)據(jù)需要在應用程序之間共享時,可以在某程序中使用 ContentProvider 定義 URI, 以使其它應用程序可以通過此 URI 訪問指定的數(shù)據(jù)
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;
-
-
- 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) {
-
- }
-
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
-
- }
-
- @Override
- public void onOpen(SQLiteDatabase db) {
- super.onOpen(db);
-
-
- }
- }
-
-
- 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;
-
-
- @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("創(chuàng)建表");
- 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("更新指定數(shù)據(jù)");
- btn4.setOnClickListener(new Button.OnClickListener() {
- public void onClick(View v) {
- updateItem();
- }
- });
-
- Button btn5 = (Button) this.findViewById(R.id.btn5);
- btn5.setText("顯示全部數(shù)據(jù)");
- 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("數(shù)據(jù)表成功創(chuàng)建\n");
- } catch (SQLException ex) {
- txtMsg.append("數(shù)據(jù)表創(chuàng)建錯誤\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() + ")";
-
- db.execSQL(sql);
- }
- txtMsg.append("成功插入 3 條數(shù)據(jù)\n");
- } catch (SQLException ex) {
- txtMsg.append("插入數(shù)據(jù)失敗\n" + ex.toString() + "\n");
- }
- }
-
-
- private void deleteItem() {
- try {
- SQLiteDatabase db = dbHelper.getWritableDatabase();
- db.delete(TABLE_NAME, " id < 999999", null);
- txtMsg.append("成功刪除數(shù)據(jù)\n");
- } catch (SQLException e) {
- txtMsg.append("刪除數(shù)據(jù)失敗\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("成功更新數(shù)據(jù)\n");
- } catch (SQLException e) {
- txtMsg.append("更新數(shù)據(jù)失敗\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("讀取數(shù)據(jù)失敗\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("數(shù)據(jù)表刪除成功\n");
- } catch (SQLException ex) {
- txtMsg.append("數(shù)據(jù)表刪除錯誤\n" + ex.toString() + "\n");
- }
- }
- }
-
-
- 2、ContentProvider 的 Demo
- MyUser.java
-
- 代碼
- package com.webabcd.contentprovider;
-
- import android.net.Uri;
- import android.provider.BaseColumns;
-
-
- public class MyUser {
-
-
- public static final class User implements BaseColumns {
-
-
- 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;
-
-
- public class MyContentProvider extends ContentProvider {
-
- private File file;
- private FileOutputStream out;
- private FileInputStream in;
-
-
- @Override
- public int delete(Uri uri, String selection, String[] selectionArgs) {
-
- return 0;
- }
-
- @Override
- public String getType(Uri uri) {
-
- return null;
- }
-
-
- @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 {
-
-
- file = new File("/data/data/com.webabcd.contentprovider/",
- "demo.txt");
- if (!file.exists())
- file.createNewFile();
-
- return true;
- } catch (Exception ex) {
- return false;
- }
- }
-
-
- @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;
- }
- }
-
-
- @Override
- public int update(Uri uri, ContentValues values, String selection,
- String[] selectionArgs) {
-
- 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;
-
-
-
-
-
-
-
- public class Main extends Activity {
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
-
- Button btn1 = (Button) this.findViewById(R.id.btn1);
- btn1.setText("新增聯(lián)系人記錄");
- 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("查看聯(lián)系人記錄");
- btn2.setOnClickListener(new Button.OnClickListener() {
- public void onClick(View v) {
- displayRecords();
- }
- });
-
- Button btn3 = (Button) this.findViewById(R.id.btn3);
- btn3.setText("清除聯(lián)系人記錄");
- btn3.setOnClickListener(new Button.OnClickListener() {
- public void onClick(View v) {
- deleteRecords();
- }
- });
-
- Button btn4 = (Button) this.findViewById(R.id.btn4);
- btn4.setText("更新聯(lián)系人記錄");
- btn4.setOnClickListener(new Button.OnClickListener() {
- public void onClick(View v) {
-
- 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();
- }
- });
- }
-
-
- 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);
- }
-
-
- 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,
- null,
- null
- );
-
- 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();
- }
- }
- }
-
-
- private void deleteRecords() {
- Uri uri = People.CONTENT_URI;
- Log.d("MyDebug", uri.toString());
- getContentResolver().delete(uri, null, null);
-
- }
-
-
- 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);
- }
-
-
-
- private void insertRecord2MyContentProvider(String name) {
- ContentValues values = new ContentValues();
- values.put(MyUser.User.USER_NAME, name);
- getContentResolver().insert(MyUser.User.CONTENT_URI, values);
-
- }
-
-
- 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>