系出名门Android(9) - 数据库支持(SQLite),

来源:互联网 发布:如何装扮淘宝店铺 编辑:程序博客网 时间:2024/04/26 18:45

系出名门Android(9) - 数据库支持(SQLite),

文章分类:移动开发
系出名门Android(9) - 数据库支持(SQLite), 内容提供器(ContentProvider)


作者:webabcd


介绍
在 Android 中使用 SQLite, ContentProvider 
数据库支持(SQLite) - Android 开发平台提供了操作 SQLite 数据库的相关 API
内容提供器(ContentProvider) - 当数据需要在应用程序之间共享时,可以在某程序中使用 ContentProvider 定义 URI, 以使其它应用程序可以通过此 URI 访问指定的数据


1、SQLite 的 Demo
DatabaseHelper.java

Java代码 复制代码
  1. 代码    
  2. package com.webabcd.SQLite;   
  3.   
  4. import android.content.Context;   
  5. import android.database.sqlite.SQLiteDatabase;   
  6. import android.database.sqlite.SQLiteOpenHelper;   
  7. import android.database.sqlite.SQLiteDatabase.CursorFactory;   
  8.   
  9. // 数据库操作的 Helper 类   
  10. public class DatabaseHelper extends SQLiteOpenHelper {   
  11.   
  12.     DatabaseHelper(Context context, String name, CursorFactory cursorFactory, int version) {   
  13.         super(context, name, cursorFactory, version);   
  14.     }   
  15.   
  16.     @Override  
  17.     public void onCreate(SQLiteDatabase db) {   
  18.         // TODO 创建数据库后,对数据库的操作   
  19.     }   
  20.   
  21.     @Override  
  22.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {   
  23.         // TODO 更改数据库版本的操作   
  24.     }   
  25.   
  26.     @Override  
  27.     public void onOpen(SQLiteDatabase db) {   
  28.         super.onOpen(db);   
  29.            
  30.         // TODO 每次成功打开数据库后首先被执行   
  31.     }   
  32. }   
  33.   
  34.   
  35. Main.java   
  36.   
  37. 代码    
  38. package com.webabcd.SQLite;   
  39.   
  40. import java.util.Random;   
  41.   
  42. import android.app.Activity;   
  43. import android.content.ContentValues;   
  44. import android.database.Cursor;   
  45. import android.database.SQLException;   
  46. import android.database.sqlite.SQLiteDatabase;   
  47. import android.os.Bundle;   
  48. import android.view.View;   
  49. import android.widget.Button;   
  50. import android.widget.TextView;   
  51.   
  52. public class Main extends Activity {   
  53.   
  54.     private DatabaseHelper dbHelper;   
  55.   
  56.     private static final String DATABASE_NAME = "db.db";   
  57.     private static final int DATABASE_VERSION = 1;   
  58.     private static final String TABLE_NAME = "employee";   
  59.   
  60.     TextView txtMsg;   
  61.   
  62.     /** Called when the activity is first created. */  
  63.     @Override  
  64.     public void onCreate(Bundle savedInstanceState) {   
  65.         super.onCreate(savedInstanceState);   
  66.         setContentView(R.layout.main);   
  67.   
  68.         dbHelper = new DatabaseHelper(this, DATABASE_NAME, null,   
  69.                 DATABASE_VERSION);   
  70.   
  71.         txtMsg = (TextView) this.findViewById(R.id.txtMsg);   
  72.   
  73.         Button btn1 = (Button) this.findViewById(R.id.btn1);   
  74.         btn1.setText("创建表");   
  75.         btn1.setOnClickListener(new Button.OnClickListener() {   
  76.             public void onClick(View v) {   
  77.                 CreateTable();   
  78.             }   
  79.         });   
  80.   
  81.         Button btn2 = (Button) this.findViewById(R.id.btn2);   
  82.         btn2.setText("插入 3 条记录");   
  83.         btn2.setOnClickListener(new Button.OnClickListener() {   
  84.             public void onClick(View v) {   
  85.                 insertItem();   
  86.             }   
  87.         });   
  88.   
  89.         Button btn3 = (Button) this.findViewById(R.id.btn3);   
  90.         btn3.setText("删除全部记录");   
  91.         btn3.setOnClickListener(new Button.OnClickListener() {   
  92.             public void onClick(View v) {   
  93.                 deleteItem();   
  94.             }   
  95.         });   
  96.   
  97.         Button btn4 = (Button) this.findViewById(R.id.btn4);   
  98.         btn4.setText("更新指定数据");   
  99.         btn4.setOnClickListener(new Button.OnClickListener() {   
  100.             public void onClick(View v) {   
  101.                 updateItem();   
  102.             }   
  103.         });   
  104.   
  105.         Button btn5 = (Button) this.findViewById(R.id.btn5);   
  106.         btn5.setText("显示全部数据");   
  107.         btn5.setOnClickListener(new Button.OnClickListener() {   
  108.             public void onClick(View v) {   
  109.                 showItems();   
  110.             }   
  111.         });   
  112.   
  113.         Button btn6 = (Button) this.findViewById(R.id.btn6);   
  114.         btn6.setText("删除表");   
  115.         btn6.setOnClickListener(new Button.OnClickListener() {   
  116.             public void onClick(View v) {   
  117.                 dropTable();   
  118.             }   
  119.         });   
  120.     }   
  121.   
  122.     // 创建数据表   
  123.     private void CreateTable() {   
  124.         SQLiteDatabase db = dbHelper.getWritableDatabase();   
  125.         String sql = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME   
  126.                 + " (ID INTEGER PRIMARY KEY, Name VARCHAR, Age INTEGER);";   
  127.         try {   
  128.             db.execSQL(sql);   
  129.             txtMsg.append("数据表成功创建/n");   
  130.         } catch (SQLException ex) {   
  131.             txtMsg.append("数据表创建错误/n" + ex.toString() + "/n");   
  132.         }   
  133.     }   
  134.   
  135.     // 插入数据   
  136.     private void insertItem() {   
  137.         SQLiteDatabase db = dbHelper.getWritableDatabase();   
  138.            
  139.         try {   
  140.             Random random = new Random();   
  141.             for (int i = 0; i < 3; i++) {   
  142.                 String sql = "insert into " + TABLE_NAME   
  143.                         + " (name, age) values ('name" + String.valueOf(i)   
  144.                         + "', " + random.nextInt() + ")";   
  145.                 // execSQL() - 执行指定的 sql   
  146.                 db.execSQL(sql);   
  147.             }   
  148.             txtMsg.append("成功插入 3 条数据/n");   
  149.         } catch (SQLException ex) {   
  150.             txtMsg.append("插入数据失败/n" + ex.toString() + "/n");   
  151.         }   
  152.     }   
  153.   
  154.     // 删除数据   
  155.     private void deleteItem() {   
  156.         try {   
  157.             SQLiteDatabase db = dbHelper.getWritableDatabase();   
  158.             db.delete(TABLE_NAME, " id < 999999"null);   
  159.             txtMsg.append("成功删除数据/n");   
  160.         } catch (SQLException e) {   
  161.             txtMsg.append("删除数据失败/n");   
  162.         }   
  163.     }   
  164.   
  165.     // 更新数据   
  166.     private void updateItem() {   
  167.         SQLiteDatabase db = dbHelper.getWritableDatabase();   
  168.   
  169.         try {   
  170.             ContentValues values = new ContentValues();   
  171.             values.put("name""批量更新后的名字");   
  172.   
  173.             db.update(TABLE_NAME, values, "id<?"new String[] { "3" });   
  174.             txtMsg.append("成功更新数据/n");   
  175.         } catch (SQLException e) {   
  176.             txtMsg.append("更新数据失败/n");   
  177.         }   
  178.     }   
  179.   
  180.     // 查询数据   
  181.     private void showItems() {   
  182.         SQLiteDatabase db = dbHelper.getReadableDatabase();   
  183.   
  184.         try {   
  185.             String[] column = { "id""name""age" };   
  186.             Cursor cursor = db.query(TABLE_NAME, column, nullnullnull,   
  187.                     nullnull);   
  188.             Integer num = cursor.getCount();   
  189.             txtMsg.append("共 " + Integer.toString(num) + " 条记录/n");   
  190.             cursor.moveToFirst();   
  191.   
  192.             while (cursor.getPosition() != cursor.getCount()) {   
  193.                 txtMsg.append(Integer.toString(cursor.getPosition()) + ","  
  194.                         + String.valueOf(cursor.getString(0)) + ","  
  195.                         + cursor.getString(1) + ","  
  196.                         + String.valueOf(cursor.getString(2)) + "/n");   
  197.                 cursor.moveToNext();   
  198.             }   
  199.         } catch (SQLException ex) {   
  200.             txtMsg.append("读取数据失败/n" + ex.toString() + "/n");   
  201.         }   
  202.     }   
  203.   
  204.     // 删除数据表   
  205.     private void dropTable() {   
  206.         SQLiteDatabase db = dbHelper.getWritableDatabase();   
  207.         String sql = "DROP TABLE IF EXISTS " + TABLE_NAME;   
  208.         try {   
  209.             db.execSQL(sql);   
  210.             txtMsg.append("数据表删除成功/n");   
  211.         } catch (SQLException ex) {   
  212.             txtMsg.append("数据表删除错误/n" + ex.toString() + "/n");   
  213.         }   
  214.     }   
  215. }   
  216.   
  217.   
  218. 2、ContentProvider 的 Demo   
  219. MyUser.java   
  220.   
  221. 代码    
  222. package com.webabcd.contentprovider;   
  223.   
  224. import android.net.Uri;   
  225. import android.provider.BaseColumns;   
  226.   
  227. // 自定义 ContentProvider 所需的实体类   
  228. public class MyUser {   
  229.   
  230.     // 必须要有 _id 字段。本例中 BaseColumn 类中已经包含了 _id 字段   
  231.     public static final class User implements BaseColumns {   
  232.            
  233.         // 定义 CONTENT_URI   
  234.         public static final Uri CONTENT_URI = Uri.parse("content://com.webabcd.MyContentProvider");   
  235.   
  236.         // 表数据列   
  237.         public static final String USER_NAME = "USER_NAME";   
  238.     }   
  239. }   
  240.   
  241.   
  242. MyContentProvider.java   
  243.   
  244. 代码    
  245. package com.webabcd.contentprovider;   
  246.   
  247. import java.io.File;   
  248. import java.io.FileInputStream;   
  249. import java.io.FileOutputStream;   
  250.   
  251. import org.apache.http.util.EncodingUtils;   
  252.   
  253. import android.content.ContentProvider;   
  254. import android.content.ContentUris;   
  255. import android.content.ContentValues;   
  256. import android.database.Cursor;   
  257. import android.database.MatrixCursor;   
  258. import android.net.Uri;   
  259.   
  260. // 继承 ContentProvider 以实现自定义的 ContentProvider(基于文件的信息存储)   
  261. public class MyContentProvider extends ContentProvider {   
  262.   
  263.     private File file;   
  264.     private FileOutputStream out;   
  265.     private FileInputStream in;   
  266.   
  267.     // ContentProvider 的删除数据接口   
  268.     @Override  
  269.     public int delete(Uri uri, String selection, String[] selectionArgs) {   
  270.         // TODO Auto-generated method stub   
  271.         return 0;   
  272.     }   
  273.   
  274.     @Override  
  275.     public String getType(Uri uri) {   
  276.         // TODO Auto-generated method stub   
  277.         return null;   
  278.     }   
  279.   
  280.     // ContentProvider 的插入数据接口    
  281.     @Override  
  282.     public Uri insert(Uri uri, ContentValues values) {   
  283.   
  284.         try {   
  285.             out = new FileOutputStream(file);   
  286.             out.write(values.getAsString(MyUser.User.USER_NAME).getBytes());   
  287.             out.close();   
  288.   
  289.             int rowId = 0;   
  290.             Uri rowUri = ContentUris.appendId(   
  291.                     MyUser.User.CONTENT_URI.buildUpon(), rowId).build();   
  292.             getContext().getContentResolver().notifyChange(rowUri, null);   
  293.   
  294.             return rowUri;   
  295.         } catch (Exception e) {   
  296.             return null;   
  297.         }   
  298.     }   
  299.   
  300.     // 创建用于保存信息的文件   
  301.     @Override  
  302.     public boolean onCreate() {   
  303.         try {   
  304.             // 每个包中应用程序的私有目录为:/data/data/包名/   
  305.             // SD 卡目录为:/sdcard   
  306.             file = new File("/data/data/com.webabcd.contentprovider/",   
  307.                     "demo.txt");   
  308.             if (!file.exists())   
  309.                 file.createNewFile();   
  310.   
  311.             return true;   
  312.         } catch (Exception ex) {   
  313.             return false;   
  314.         }   
  315.     }   
  316.   
  317.     // ContentProvider 的查询数据接口   
  318.     @Override  
  319.     public Cursor query(Uri uri, String[] projection, String selection,   
  320.             String[] selectionArgs, String sortOrder) {   
  321.            
  322.         String content;   
  323.   
  324.         try {   
  325.             in = new FileInputStream(file);   
  326.             int length = (int) file.length();   
  327.             byte[] buffer = new byte[length];   
  328.             in.read(buffer, 0, length);   
  329.             content = EncodingUtils.getString(buffer, "UTF-8");   
  330.             in.close();   
  331.   
  332.             String[] columns = new String[] { MyUser.User._ID, MyUser.User.USER_NAME };   
  333.             MatrixCursor cur = new MatrixCursor(columns);   
  334.             String[] values = new String[] { "0", content };   
  335.             cur.moveToFirst();   
  336.             cur.addRow(values);   
  337.   
  338.             return cur;   
  339.         } catch (Exception e) {   
  340.             return null;   
  341.         }   
  342.     }   
  343.   
  344.     // ContentProvider 的更新数据接口   
  345.     @Override  
  346.     public int update(Uri uri, ContentValues values, String selection,   
  347.             String[] selectionArgs) {   
  348.         // TODO Auto-generated method stub   
  349.         return 0;   
  350.     }   
  351. }   
  352.   
  353.   
  354. Main.java   
  355.   
  356. 代码    
  357. package com.webabcd.contentprovider;   
  358.   
  359. import java.util.Random;   
  360.   
  361. import android.app.Activity;   
  362. import android.content.ContentUris;   
  363. import android.content.ContentValues;   
  364. import android.database.Cursor;   
  365. import android.net.Uri;   
  366. import android.os.Bundle;   
  367. import android.provider.Contacts;   
  368. import android.provider.Contacts.People;   
  369. import android.util.Log;   
  370. import android.view.View;   
  371. import android.widget.Button;   
  372. import android.widget.Toast;   
  373.   
  374. /*  
  375.  * 几个常用的系统内置的 ContentProvider 如下:   
  376.  * content://media/internal/images  这个URI将返回设备上存储的所有图片  
  377.  * content://contacts/people/ 这个URI将返回设备上的所有联系人信息  
  378.  * content://contacts/people/45 这个URI返回单个结果(联系人信息中ID为45的联系人记录)  
  379.  */  
  380. public class Main extends Activity {   
  381.     /** Called when the activity is first created. */  
  382.     @Override  
  383.     public void onCreate(Bundle savedInstanceState) {   
  384.         super.onCreate(savedInstanceState);   
  385.         setContentView(R.layout.main);   
  386.   
  387.         Button btn1 = (Button) this.findViewById(R.id.btn1);   
  388.         btn1.setText("新增联系人记录");   
  389.         btn1.setOnClickListener(new Button.OnClickListener() {   
  390.             public void onClick(View v) {   
  391.                 Random random = new Random();   
  392.                 insertRecords("name" + String.valueOf(random.nextInt()), String   
  393.                         .valueOf(random.nextInt()));   
  394.             }   
  395.         });   
  396.   
  397.         Button btn2 = (Button) this.findViewById(R.id.btn2);   
  398.         btn2.setText("查看联系人记录");   
  399.         btn2.setOnClickListener(new Button.OnClickListener() {   
  400.             public void onClick(View v) {   
  401.                 displayRecords();   
  402.             }   
  403.         });   
  404.   
  405.         Button btn3 = (Button) this.findViewById(R.id.btn3);   
  406.         btn3.setText("清除联系人记录");   
  407.         btn3.setOnClickListener(new Button.OnClickListener() {   
  408.             public void onClick(View v) {   
  409.                 deleteRecords();   
  410.             }   
  411.         });   
  412.   
  413.         Button btn4 = (Button) this.findViewById(R.id.btn4);   
  414.         btn4.setText("更新联系人记录");   
  415.         btn4.setOnClickListener(new Button.OnClickListener() {   
  416.             public void onClick(View v) {   
  417.                 // 此处只是演示,id 来自 People._ID ,可参见 displayRecords() 是如何获取 id 的   
  418.                 int id = 0;   
  419.                 updateRecord(id, "修改后的name");   
  420.             }   
  421.         });   
  422.   
  423.         Button btn5 = (Button) this.findViewById(R.id.btn5);   
  424.         btn5.setText("新增记录到 MyContentProvider");   
  425.         btn5.setOnClickListener(new Button.OnClickListener() {   
  426.             public void onClick(View v) {   
  427.                 insertRecord2MyContentProvider("webabcd");   
  428.             }   
  429.         });   
  430.   
  431.         Button btn6 = (Button) this.findViewById(R.id.btn6);   
  432.         btn6.setText("获取记录从 MyContentProvider");   
  433.         btn6.setOnClickListener(new Button.OnClickListener() {   
  434.             public void onClick(View v) {   
  435.                 displayRecord2MyContentProvider();   
  436.             }   
  437.         });   
  438.     }   
  439.   
  440.     // 调用 ContentProvider 的插入接口   
  441.     private void insertRecords(String name, String phoneNum) {   
  442.         ContentValues values = new ContentValues();   
  443.         values.put(People.NAME, name);   
  444.         Uri uri = getContentResolver().insert(People.CONTENT_URI, values);   
  445.         Log.d("MyDebug", uri.toString());   
  446.         Uri numberUri = Uri.withAppendedPath(uri,   
  447.                 People.Phones.CONTENT_DIRECTORY);   
  448.         Log.d("MyDebug", numberUri.toString());   
  449.   
  450.         values.clear();   
  451.         values.put(Contacts.Phones.TYPE, People.Phones.TYPE_MOBILE);   
  452.         values.put(People.NUMBER, phoneNum);   
  453.         getContentResolver().insert(numberUri, values);   
  454.     }   
  455.   
  456.     // 调用 ContentProvider 的查询接口   
  457.     private void displayRecords() {   
  458.         String[] columns = new String[] { People._ID, People.NAME,   
  459.                 People.NUMBER };   
  460.         Uri contacts = People.CONTENT_URI;   
  461.         Log.d("MyDebug", contacts.toString());   
  462.         Cursor cur = managedQuery(contacts, columns, // 要返回的数据字段   
  463.                 null// WHERE子句   
  464.                 null// WHERE 子句的参数   
  465.                 null // Order-by子句   
  466.         );   
  467.   
  468.         if (cur.moveToFirst()) {   
  469.             String id = null;   
  470.             String name = null;   
  471.             String phoneNo = null;   
  472.             while (cur.getPosition() != cur.getCount()) {   
  473.                 id = cur.getString(cur.getColumnIndex(People._ID));   
  474.                 name = cur.getString(cur.getColumnIndex(People.NAME));   
  475.                 phoneNo = cur.getString(cur.getColumnIndex(People.NUMBER));   
  476.   
  477.                 Toast.makeText(this, id + " / " + name + " / " + phoneNo,   
  478.                         Toast.LENGTH_SHORT).show();   
  479.                 cur.moveToNext();   
  480.             }   
  481.         }   
  482.     }   
  483.   
  484.     // 调用 ContentProvider 的删除接口   
  485.     private void deleteRecords() {   
  486.         Uri uri = People.CONTENT_URI;   
  487.         Log.d("MyDebug", uri.toString());   
  488.         getContentResolver().delete(uri, nullnull);   
  489.         // getContentResolver().delete(uri, "NAME=" + "'name'", null);   
  490.     }   
  491.   
  492.     // 调用 ContentProvider 的更新接口   
  493.     private void updateRecord(int recordNo, String name) {   
  494.         Uri uri = ContentUris.withAppendedId(People.CONTENT_URI, recordNo);   
  495.         Log.d("MyDebug", uri.toString());   
  496.         ContentValues values = new ContentValues();   
  497.         values.put(People.NAME, name);   
  498.         getContentResolver().update(uri, values, nullnull);   
  499.     }   
  500.   
  501.        
  502.     // 调用自定义 ContentProvider 的插入接口   
  503.     private void insertRecord2MyContentProvider(String name) {   
  504.         ContentValues values = new ContentValues();   
  505.         values.put(MyUser.User.USER_NAME, name);   
  506.         getContentResolver().insert(MyUser.User.CONTENT_URI, values);   
  507.   
  508.     }   
  509.   
  510.     // 调用自定义 ContentProvider 的查询接口   
  511.     private void displayRecord2MyContentProvider() {   
  512.         String[] columns = new String[] { MyUser.User.USER_NAME };   
  513.         Uri uri = MyUser.User.CONTENT_URI;   
  514.         Cursor cur = managedQuery(uri, columns, nullnullnull);   
  515.   
  516.         while (cur.getPosition() != cur.getCount()) {   
  517.             String id = cur.getString(cur.getColumnIndex(People._ID));   
  518.             String name = cur.getString(cur.getColumnIndex(MyUser.User.USER_NAME));   
  519.             Toast.makeText(this,   
  520.                     id + " / " + name,   
  521.                     Toast.LENGTH_SHORT).show();   
  522.             cur.moveToNext();   
  523.         }   
  524.     }   
  525. }   
  526.   
  527. AndroidManifest.xml   
  528.   
  529. 代码    
  530. <?xml version="1.0" encoding="utf-8"?>   
  531. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  532.       package="com.webabcd.contentprovider"  
  533.       android:versionCode="1"  
  534.       android:versionName="1.0">   
  535.     <application android:icon="@drawable/icon" android:label="@string/app_name">   
  536.         <activity android:name=".Main"  
  537.                   android:label="@string/app_name">   
  538.             <intent-filter>   
  539.                 <action android:name="android.intent.action.MAIN" />   
  540.                 <category android:name="android.intent.category.LAUNCHER" />   
  541.             </intent-filter>   
  542.         </activity>   
  543.            
  544.         <!--   
  545.             配置一个自定义的 ContentProvider"   
  546.         -->   
  547.         <provider android:name="MyContentProvider" android:authorities="com.webabcd.MyContentProvider" />   
  548.     </application>   
  549.     <uses-permission android:name="android.permission.WRITE_CONTACTS"></uses-permission>   
  550.     <uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>   
  551.     <uses-sdk android:minSdkVersion="3" />   
  552. </manifest>   

原创粉丝点击