创建数据库和表
数据库设计:
建立三张表: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