Launcher开发之SQLiteDatabase数据库管理

来源:互联网 发布:微信浏览器js跳转页面 编辑:程序博客网 时间:2024/06/10 02:08

转载,原博地址:http://blog.csdn.net/jiang4920/article/details/17500189

====================================================================================================================================

在Android开发中SQLite3经常会用到,上文添加Widget的功能中,Launcher重启后,已经被添加到界面上的widget需要在初始化的时候一并加载到界面上,这里就用到数据库来管理widget的显示与否和位置等参数.

        先说一下Android中数据库的使用关键点:

1.标准T-sql语句

2.Cursor的使用,sql查询返回的数据到用Cursor存储,遍历Cursor读取数据,数据读取结束则关闭Cursor。另外注意在使用CursorAdapter的时候应该掌握好关闭Cursor的时机,在使用CursorAdapter绑定到界面显示的时候不能关闭Cursor,如果关闭了,界面就不显示数据了,所以要在CursorAdapter未使用的时候才能关闭Cursor。

3.使用SQLiteHelper管理数据库会让数据库操作非常简单


下面是使用SQLiteHelper封装的数据库管理的类,已加注释,不理解的地方可以评论:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. import android.content.ContentValues;  
  2. import android.content.Context;  
  3. import android.database.Cursor;  
  4. import android.database.sqlite.SQLiteDatabase;  
  5. import android.database.sqlite.SQLiteDatabase.CursorFactory;  
  6. import android.database.sqlite.SQLiteOpenHelper;  
  7. import android.util.Log;  
  8.   
  9. public class DatabaseManager extends SQLiteOpenHelper {  
  10.   
  11.     public static final String DB_NAME = "launcher";  
  12.     public static final String TABLE_WIDGET = "widget";  
  13.     public static final String TABLE_WIDGET_WIDGETID = "widgetID";  
  14.     public static final String TABLE_WIDGET_VISIBILITY = "visiblility";  
  15.     private static final String SQL_TABLE_WIDGET_CREATE = "create table " + TABLE_WIDGET + " ("  
  16.             + "_id INTEGER PRIMARY KEY autoincrement,"  
  17.             + TABLE_WIDGET_WIDGETID + " INTEGER NOT NULL, "  
  18.             + TABLE_WIDGET_VISIBILITY + " INTEGER" + " default 1)";  
  19.       
  20.     private static SQLiteDatabase mSQLiteDatabase;  
  21.     private static DatabaseManager mDatabaseManager;  
  22.     private static final String TAG = "DatabaseManager";  
  23.     private static final int VERSION = 2;  
  24.   
  25.     public DatabaseManager(Context context, String name, CursorFactory factory,  
  26.             int version) {  
  27.         super(context, name, factory, version);  
  28.     }  
  29.       
  30.       
  31.     /** 
  32.      * 重载简化构造函数 
  33.      * @param context 
  34.      */  
  35.     public DatabaseManager(Context context) {  
  36.         super(context, DB_NAME, null, VERSION);  
  37.     }  
  38.   
  39.       
  40.     public static DatabaseManager getInstance(Context context){  
  41.         if (mDatabaseManager == null) {  
  42.             mDatabaseManager = new DatabaseManager(context);  
  43.         }  
  44.         return mDatabaseManager;  
  45.     }  
  46.       
  47.     /** 
  48.      * 获取数据库实例,这里用两个静态变量是为了APK在运行是始终只有一个SQLiteDatabase实例, 
  49.      * 在退出APK的时候能安全的关闭SQLiteDatabase; 
  50.      * 如果觉得有必要Cursor的管理可以在这个类中创建一个Cursor管理器,因为cursor也需要及时的关闭 
  51.      * ,否则会有大量的错误日志打印,不过也不必太担心, 因为系统对此做了处理,但是会比较消耗内存,健康的设计必须很好的管理SQLiteDatabase 
  52.      *  
  53.      * @param context 
  54.      * @return 返回SQLiteDatabase实例 
  55.      */  
  56.     public static SQLiteDatabase getDatabase(Context context) {  
  57.         if (mDatabaseManager == null) {  
  58.             mDatabaseManager = new DatabaseManager(context);  
  59.         }  
  60.         if (mSQLiteDatabase == null) {  
  61.             mSQLiteDatabase = mDatabaseManager.getWritableDatabase();  
  62.         }  
  63.         return mSQLiteDatabase;  
  64.     }  
  65.   
  66.       
  67.     /** 
  68.      * 保存widgetid到数据库 
  69.      * @param context 
  70.      * @param widgetId 
  71.      */  
  72.     public void insertWidget(Context context, int widgetId) {  
  73.         ContentValues values = new ContentValues();  
  74.         values.put(DatabaseManager.TABLE_WIDGET_WIDGETID, widgetId);  
  75.         String where = TABLE_WIDGET_WIDGETID + " = " + widgetId;  
  76.         Cursor cursor = getDatabase(context).query(TABLE_WIDGET, null, where,  
  77.                 nullnullnullnull);  
  78.         if (cursor != null && cursor.getCount() >= 1) {  
  79.             getDatabase(context).update(TABLE_WIDGET, values, where, null);  
  80.         } else {  
  81.             getDatabase(context).insert(TABLE_WIDGET, null, values);  
  82.         }  
  83.     }  
  84.       
  85.       
  86.     /** 
  87.      * 获取已加载的widget 
  88.      * @param context 
  89.      * @return 
  90.      */  
  91.     public int[] getAddedWidgetArray(Context context){  
  92.         Cursor cursor = getDatabase(context).query(TABLE_WIDGET, new String[]{TABLE_WIDGET_WIDGETID}, nullnullnullnullnull);  
  93.         if(cursor != null){  
  94.             Log.v(TAG, "cursor:"+cursor.getCount());  
  95.             int[] widgets = new int[cursor.getCount()];  
  96.             int i =0;  
  97.             for(cursor.moveToFirst();!cursor.isAfterLast();cursor.moveToNext()){  
  98.                 widgets[i] = cursor.getInt(cursor.getColumnIndex(TABLE_WIDGET_WIDGETID));  
  99.                 ++i;  
  100.             }  
  101.             cursor.close();  
  102.             return widgets;  
  103.         }  
  104.         return null;  
  105.     }  
  106.   
  107.     @Override  
  108.     public void onCreate(SQLiteDatabase db) {  
  109.         // 在这里创建表  
  110.         db.execSQL(SQL_TABLE_WIDGET_CREATE);  
  111.     }  
  112.   
  113.     @Override  
  114.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  115.         if (newVersion > oldVersion) {  
  116.             // todo sth,有时在更新APK的时候数据库改变较大,需要更新某些表,在这里作相应处理,比如拷贝用户数据到新的表中  
  117.             db.execSQL("drop table "+TABLE_WIDGET);  
  118.             db.execSQL(SQL_TABLE_WIDGET_CREATE);  
  119.         }  
  120.     }  
  121.   
  122. }  

0 0