创建数据库和表
数据库设计:
建立三张表: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,而到了一个button的onClick(View view)等方法时,我们用this时就会报错,所以我们可能使用ActivityName.this来解决,主要原因是因为实现Context的类主要有Android特有的几个模型,Activity、Service以及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