如果我们使用默认系统路径存储数据库文件:
第一步:新建一个类继承SQLiteOpenHelper;写一个构造,重写两个函数! 第二步:在新建的类中的onCreate(SQLiteDatabase db) 方法中创建一个表;
第三步:在进行删除数据、添加数据等操作的之前我们要得到数据库读写句柄得到一个数据库实例;
注意: 继承写这个辅助类,是为了在我们没有数据库的时候自动为我们生成一个数据库,并且生成数据库文件,这里也同时创建了一张表,因为我们在onCreate里是在数据库中创建一张表的操作;这里还要注意在我们new 这个我们这个MySQLiteOpenHelper 类实例对象的时候并没有创建数据库哟~!而是在我们调用 (备注3)MySQLiteOpenHelper ..getWritableDatabase() 这个方法得到数据库读写句柄的时候,Android 会分析是否已经有了数据库,如果没有会默认为我们创建一个数据库并且在系统路径data-data-com.himi-databases下生成himi.db 文件!
如果我们需要把数据库文件存储到SD卡中:
第一步:确认模拟器存在SD卡,关于SD卡的两种创建方法见我的博文:【Android 2D游戏开发之十】
第二步:(备注1)先创建SD卡目录和路径已经我们的数据库文件!这里不像上面默认路径中的那样,如果没有数据库会默认系统路径生成一个数据库和一个数据库文件!我们必须手动创建数据库文件! 第三步:在进行删除数据、添加数据等操作的之前我们要得到数据库读写句柄得到一个数据库实例;(备注2)此时的创建也不是像系统默认创建,而是我们通过打开第一步创建好的文件得到数据库实例。这里仅仅是创建一个数据库!!!!
第四步:在进行删除数据、添加数据等操作的之前我们还要创建一个表! 第五步:在配置文件AndroidMainfest.xml 声明写入SD卡的权限。
在Android中查询数据是通过Cursor类来实现的,当我们使用SQLiteDatabase.query()
方法时,会得到一个Cursor对象,Cursor指向的就是每一条数据。它提供了很多有关查询的方法,具体方法如下:
以下是方法和说明:
move 以当前的位置为参考,将Cursor移动到指定的位置,成功返回true, 失败返回false
moveToPosition将Cursor移动到指定的位置,成功返回true,失败返回false
moveToNext 将Cursor向前移动一个位置,成功返回true,失败返回false
moveToLast 将Cursor向后移动一个位置,成功返回true,失败返回 false。
movetoFirst 将Cursor移动到第一行,成功返回true,失败返回false
isBeforeFirst返回Cursor是否指向第一项数据之前
isAfterLast 返回Cursor是否指向最后一项数据之后
isClosed 返回Cursor是否关闭
isFirst返回Cursor是否指向第一项数据
isLast 返回Cursor是否指向最后一项数据
isNull 返回指定位置的值是否为null
getCount 返回总的数据项数
getInt 返回当前行中指定的索引数据
代码:
package com.Video.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
/**
* SQLiteOpenHelper是一个辅助类,用来管理数据库的创建和版本他,它提供两个方面的功能
* 第一,getReadableDatabase()、getWritableDatabase
* ()可以获得SQLiteDatabase对象,�?�过该对象可以对数据库进行操�?
* 第二,提供了onCreate()、onUpgrade()两个回调函数,允许我们再创建和升级数据库时,进行自己的操�?
*/
public class DatabaseHelper extends SQLiteOpenHelper {
private static final int VERSION = 1;
/**
* 在SQLiteOpenHelper的子类当中,必须有该构�?�函�?
*
* @param context
* 上下文对�?
* @param name
* 数据库名�?
* @param factory
* @param version
* 当前数据库的版本,�?�必须是整数并且是�?�增的状�?
*/
public DatabaseHelper(Context context, String name, CursorFactory factory,
int version) {
// 必须通过super调用父类当中的构造函�?
super(context, name, factory, version);
}
public DatabaseHelper(Context context, String name, int version) {
this(context, name, null, version);
}
public DatabaseHelper(Context context, String name) {
this(context, name, VERSION);
}
// 该函数是在第�?次创建的时�?�执行,实际上是第一次得到SQLiteDatabase对象的时候才会调用这个方�?
@Override
public void onCreate(SQLiteDatabase db) {
System.out.println("DB onCreate");
db.execSQL(SqlScript.createUserInfo);
}
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
System.out.println("upgrade a database");
}
}
package com.Video.db;
public class SqlScript {
// 创建配置表Sql
public static final String createUserInfo = "create table if not exists users_info1"
+ " (userId INTEGER PRIMARY KEY AUTOINCREMENT,userName,sex,birthdate,phoneNum,email,photo,address)";
public static final String createAnalysisInfo = "create table if not exists analysis_info1"
+ " (analysisId INTEGER PRIMARY KEY AUTOINCREMENT,userId,fs,xw,mk,pz,fc,sd,createDate,photo1,photo2,photo3)";
//数据插入
public static final String insertUserInfo = "insert into users_info1"
+ " (userName,sex,birthdate,phoneNum,email,photo,address) values(?,?,?,?,?,?,?)";
public static final String insertAnalysisInfo = "insert into analysis_info1" +
"(userId,photo_fs,photo_xw,photo_mk,photo_pz,photo_fc,createDate,photo1,photo2,photo3) values(?,?,?,?,?,?,?,?,?,?)";
public static final String insertAnalysisInfo_1 = "insert into analysis_info1" +
"(userId,createDate,photo1,photo2,photo3) values(?,?,?,?,?)";
//查询所有的分析结果
public static final String allAnalysisInfo = "select * from analysis_info1 where userId=? order by createDate desc";
//查询组数
public static final String AnalysisInfoCount = "select count(*) from analysis_info1 where userId=? ";
//查询最新拍照日期
public static final String AnalysisInfoNumber = "select createDate from analysis_info1 where userId=? order by createDate desc limit 1";
public static final String clearUserInfo = "delete from users_info1";
public static final String allUserInfo = "select * from users_info1 order by userId desc";
public static final String deleteUserInfo = "drop table users_info1";
public static final String deleteAnalysisinfo = "drop table analysis_info1";
}
// 把数据插入到数据库
private void addUserInfo() {
String s = savePath + "/" + name;
SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase();
sqliteDatabase.execSQL(SqlScript.insertUserInfo, new String[] {
et_name.getText().toString(), gender,
et_birthday.getText().toString(),
et_phone.getText().toString(),
et_email.getText().toString(),
s, et_address.getText().toString()});
Toast.makeText(ResiteUser.this, "注册成功", Toast.LENGTH_SHORT).show();
}
// 查询数据库所有数据并显示
private void showUsers_info() {
SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase();
Cursor cursor = sqliteDatabase.rawQuery(
com.Video.db.SqlScript.allUserInfo, null);
lstUserInfo.clear();
while (cursor.moveToNext()) {
UserInfo userInfo = new UserInfo();
int id = cursor.getInt(0);
userInfo.setUserid(cursor.getInt(0));
userInfo.setUsername(cursor.getString(1));
userInfo.setSex(cursor.getString(2));
userInfo.setBirthdate(cursor.getString(3));
userInfo.setPhoneNum(cursor.getString(4));
userInfo.setEmail(cursor.getString(5));
userInfo.setPhoto(cursor.getString(6));
userInfo.setAddress(cursor.getString(7));
//
// Cursor c2 =
// sqliteDatabase.rawQuery(com.czy.db.SqlScript.AnalysisInfoCount,
// new String[]{String.valueOf(id)});
// int i = c2.getCount();
lstUserInfo.add(userInfo);
}
ListViewAdapter adapter = new ListViewAdapter(this, lstUserInfo);
listview.setAdapter(adapter);
}