Launcher开发之SQLiteDatabase数据库管理(二)

nbsp;       在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封装的数据库管理的类,已加注释,不理解的地方可以评论:

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DatabaseManager extends SQLiteOpenHelper {

    public static final String DB_NAME = "launcher";
    public static final String TABLE_WIDGET = "widget";
    public static final String TABLE_WIDGET_WIDGETID = "widgetID";
    public static final String TABLE_WIDGET_VISIBILITY = "visiblility";
    private static final String SQL_TABLE_WIDGET_CREATE = "create table " + TABLE_WIDGET + " ("
            + "_id INTEGER PRIMARY KEY autoincrement,"
            + TABLE_WIDGET_WIDGETID + " INTEGER NOT NULL, "
            + TABLE_WIDGET_VISIBILITY + " INTEGER" + " default 1)";
    
    private static SQLiteDatabase mSQLiteDatabase;
    private static DatabaseManager mDatabaseManager;
    private static final String TAG = "DatabaseManager";
    private static final int VERSION = 2;

    public DatabaseManager(Context context, String name, CursorFactory factory,
            int version) {
        super(context, name, factory, version);
    }
    
    
    /**
     * 重载简化构造函数
     * @param context
     */
    public DatabaseManager(Context context) {
        super(context, DB_NAME, null, VERSION);
    }

    
    public static DatabaseManager getInstance(Context context){
        if (mDatabaseManager == null) {
            mDatabaseManager = new DatabaseManager(context);
        }
        return mDatabaseManager;
    }
    
    /**
     * 获取数据库实例,这里用两个静态变量是为了APK在运行是始终只有一个SQLiteDatabase实例,
     * 在退出APK的时候能安全的关闭SQLiteDatabase;
     * 如果觉得有必要Cursor的管理可以在这个类中创建一个Cursor管理器,因为cursor也需要及时的关闭
     * ,否则会有大量的错误日志打印,不过也不必太担心, 因为系统对此做了处理,但是会比较消耗内存,健康的设计必须很好的管理SQLiteDatabase
     * 
     * @param context
     * @return 返回SQLiteDatabase实例
     */
    public static SQLiteDatabase getDatabase(Context context) {
        if (mDatabaseManager == null) {
            mDatabaseManager = new DatabaseManager(context);
        }
        if (mSQLiteDatabase == null) {
            mSQLiteDatabase = mDatabaseManager.getWritableDatabase();
        }
        return mSQLiteDatabase;
    }

    
    /**
     * 保存widgetid到数据库
     * @param context
     * @param widgetId
     */
    public void insertWidget(Context context, int widgetId) {
        ContentValues values = new ContentValues();
        values.put(DatabaseManager.TABLE_WIDGET_WIDGETID, widgetId);
        String where = TABLE_WIDGET_WIDGETID + " = " + widgetId;
        Cursor cursor = getDatabase(context).query(TABLE_WIDGET, null, where,
                null, null, null, null);
        if (cursor != null && cursor.getCount() >= 1) {
            getDatabase(context).update(TABLE_WIDGET, values, where, null);
        } else {
            getDatabase(context).insert(TABLE_WIDGET, null, values);
        }
    }
    
    
    /**
     * 获取已加载的widget
     * @param context
     * @return
     */
    public int[] getAddedWidgetArray(Context context){
        Cursor cursor = getDatabase(context).query(TABLE_WIDGET, new String[]{TABLE_WIDGET_WIDGETID}, null, null, null, null, null);
        if(cursor != null){
            Log.v(TAG, "cursor:"+cursor.getCount());
            int[] widgets = new int[cursor.getCount()];
            int i =0;
            for(cursor.moveToFirst();!cursor.isAfterLast();cursor.moveToNext()){
                widgets[i] = cursor.getInt(cursor.getColumnIndex(TABLE_WIDGET_WIDGETID));
                ++i;
            }
            cursor.close();
            return widgets;
        }
        return null;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // 在这里创建表
        db.execSQL(SQL_TABLE_WIDGET_CREATE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (newVersion > oldVersion) {
            // todo sth,有时在更新APK的时候数据库改变较大,需要更新某些表,在这里作相应处理,比如拷贝用户数据到新的表中
            db.execSQL("drop table "+TABLE_WIDGET);
            db.execSQL(SQL_TABLE_WIDGET_CREATE);
        }
    }

}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值