android sqlite

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值