• 酷乐天气开发记录总结2


    创建数据库和表

    数据库设计:

    建立三张表:Province、city、county

    1、province

    Id:自增主键

    Province_name:省级名称

    Province_code:省级代码

    2、city

    Id:自增主键

    City_name:城市名称a

    City_code:城市代码

    Province_id:city表关联province表的外键

    3、county

    Id:自增主键

    Id:自增主键

    County_name:县级名称

    County_code:县级代码

    City_id:county表关联city表的外键

    新建CoolWeatherOpenHelper,将创建表定义为常量,方便使用:

    CREATE_PROVINCE,CREATE_CITY,CREATE_COUNTY,以CREATE_PROVINCE为例

    public static final String CREATE_PROVINCE= "create table Province ("

    + "id integer primary keyautoincrement, "//自增主键

    + "province_name text, "

    + "province_code text)";

    定义完常量之后,创建SQLiteOpenHelper方法(Android为了让我们能够更加方便地管理数据库,专门提供了一个 SQLiteOpenHelper 帮助类,借助这个类就可以非常简单地对数据库进行创建和升级。SQLiteOpenHelper 是一个抽象类,这意味着如果我们想要使用它的话,

    就需要创建一个自己的帮助类去继承它。SQLiteOpenHelper 中有两个抽象方法,分别是

    onCreate()和 onUpgrade(),我们必须在自己的帮助类里面重写这两个方法,然后分别在这两

    个方法中去实现创建、升级数据库的逻辑。)

    public CoolWeatherOpenHelper(Contextcontext, String name, CursorFactory factory,
                                intversion) {
                       super(context,name, factory, version);
             }

    其中第一个参数是context,上下文对象很多方法需要通过Context才能识别调用者的实例,比如说Toast的第一个参数就是Context,一般在Activity中我们直接用this代替,代表调用者的实例为Activity,而到了一个buttononClick(View view)等方法时,我们用this时就会报错,所以我们可能使用ActivityName.this来解决,主要原因是因为实现Context的类主要有Android特有的几个模型,ActivityService以及BroadcastReceiver

    第二个参数是数据库名。

    第三个参数是允许我们在查询数据的时候返回一个自定义的cursor。

    第四个参数是表示当前数据库的版本号,可用于对数据库进行升级操作。

    public void onCreate(SQLiteDatabase db) {
                       db.execSQL(CREATE_PROVINCE);  // 创建Province表
                       db.execSQL(CREATE_CITY);  // 创建City表
                       db.execSQL(CREATE_COUNTY);  // 创建County表
             }
    public void onUpgrade(SQLiteDatabase db,int oldVersion, int newVersion) {
             }

    其中在onCreate方法中调用execSQL方法,创建表。

    然后在model包里创建实体类province,city,county类,方便我们之后的数据操作。有关于实体类的定义和意义参照网站:

    http://zhan.renren.com/xinsiwei?gid=3602888498039286456&checked=true

    例如:province类

    public class Province {
             privateint id;
             privateString provinceName;
             privateString provinceCode;
             publicint getId() {
                       returnid;
             }
             publicvoid setId(int id) {
                       this.id= id;
             }
             publicString getProvinceName() {
                       returnprovinceName;
             }
             publicvoid setProvinceName(String provinceName) {
                       this.provinceName= provinceName;
             }
             publicString getProvinceCode() {
                       returnprovinceCode;
             }
             publicvoid setProvinceCode(String provinceCode) {
                       this.provinceCode= provinceCode;
             }
    }

    可以看到,创建实体类的方法非常简单,只需要创建get,set方法即可。

    创建CoolWeatherDb类,用于将一些常用的数据库操作封装起来,方便之后使用。

    创建常量:

    public static final String DB_NAME ="cool_weather";//数据库名称
    public static final int VERSION = 1;//数据库版本
    private static CoolWeatherDB coolWeatherDB;
    private SQLiteDatabase db;

    将构造方法私有化:

    private CoolWeatherDB(Context context) {
                       CoolWeatherOpenHelperdbHelper = new CoolWeatherOpenHelper(context,
                                         DB_NAME,null, VERSION);
                       db= dbHelper.getWritableDatabase();
             }

    构造函数:http://segmentfault.com/q/1010000000117838

    private CoolWeatherDB(Context context) {
                       CoolWeatherOpenHelperdbHelper = new CoolWeatherOpenHelper(context,
                                         DB_NAME,null, VERSION);
                       db= dbHelper.getWritableDatabase();
             }

    获取单实例:http://www.cnblogs.com/whgw/archive/2011/10/05/2199535.html

    public synchronized static CoolWeatherDBgetInstance(Context context) {
                       if(coolWeatherDB == null) {
                                coolWeatherDB= new CoolWeatherDB(context);
                       }
                       returncoolWeatherDB;
             }

    Synchronized:当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。

    http://www.cnblogs.com/gnagwang/archive/2011/02/27/1966606.html

    getInstance:是一个函数,可以使用这种方式使用单例模式创建类的实例,所谓单例模式就是一个类有且只有一个实例,

    http://xiaodiandian.iteye.com/blog/665104

    http://bbs.csdn.net/topics/190163233

    将province,city,county实例存储到数据库中

    public void saveProvince(Province province){
                       if(province != null) {
                                ContentValuesvalues = new ContentValues();
                                values.put("province_name",province.getProvinceName());
                                values.put("province_code",province.getProvinceCode());
                                db.insert("Province",null, values);
                       }
             }

    利用ContentValues方法进行赋值。

    从数据库中读取province,city,county信息

    public List<Province> loadProvinces(){
                       List<Province>list = new ArrayList<Province>();
                       Cursorcursor = db
                                         .query("Province",null, null, null, null, null, null);
                       if(cursor.moveToFirst()) {
                                do{
                                         Provinceprovince = new Province();
                                         province.setId(cursor.getInt(cursor.getColumnIndex("id")));
                                         province.setProvinceName(cursor.getString(cursor
                                                            .getColumnIndex("province_name")));
                                         province.setProvinceCode(cursor.getString(cursor
                                                            .getColumnIndex("province_code")));
                                         list.add(province);
                                }while (cursor.moveToNext());
                       }
                       returnlist;
             }

    首先定义一个集合,并将其初始化,然后定义游标,用于遍历查询。

    Cursor 是每行的集合。

    cursor.moveToFirst()定位第一行

    cursor.moveToNext()光标移动到下一行

    cursor.getColumnIndex返回指定列的名称

    http://www.cnblogs.com/terryblog/archive/2010/07/05/1771459.html

    先找到表的列是province_name的列,然后将数据提取出来,给province赋值。

    List.add(province)将数据添加到集合中

    loadProvinces方法返回值是list


  • 相关阅读:
    搜索1011
    搜索1008(二分)
    贪心算法专题总结
    贪心算法1002
    c++笔记
    贪心算法1017
    贪心算法1008
    贪心算法1013
    Ubuntu中 sudo update与sudo upgrade的作用及区别
    requirejs 扩展,支持脚本资源预加载
  • 原文地址:https://www.cnblogs.com/lemonhome/p/4492647.html
Copyright © 2020-2023  润新知