Android SQLite

来源:互联网 发布:瑞士方阵知乎 编辑:程序博客网 时间:2024/05/18 10:08
sqlite是Android操作系统内置的一个非常小的关系型数据库 可以实现 事务 主外键关联 


SQLiteOpenHelper 系统提供的一个助手类 用于访问SQLite数据库


要想对数据库进行操作 必须得到SQLiteDatabase的一个对象

获得SQLiteDatabase对象的方法:

首先要 new 一个SQLiteOpenHelper 对象  (由于SQLiteOpenHelper 是一个抽象类,必须新建一个类继承他)

使用这个对象的 getReadableDatabase() 或 getWritableDatabase()方法就可以获得一个 可读 或 可写 的数据库对象 SQLiteDatabase

在SQLiteOepnHelper的子类当中,必须有该构造函数:
public DatabaseHelper(Context context, String name, CursorFactory factory,
int version) {
//必须通过super调用父类当中的构造函数
super(context, name, factory, version);
}

在第一次创建数据库的时候(也就是第一次调用getReadableDatabase() 或 getWritableDatabase() 方法的时候)

系统会自动调用    onCreate() 这个回调函数,我们在可以在创建这个类时复写这个函数

下面是一个SQLiteOpenHelper 助手类的例子:

//DatabaseHelper作为一个访问SQLite的助手类,提供两个方面的功能,//第一,getReadableDatabase(),getWritableDatabase()可以获得SQLiteDatabse对象,通过该对象可以对数据库进行操作//第二,提供了onCreate()和onUpgrade()两个回调函数,允许我们在创建和升级数据库时,进行自己的操作public class DatabaseHelper extends SQLiteOpenHelper {private static final int VERSION = 1;//在SQLiteOepnHelper的子类当中,必须有该构造函数 version为版本号 版本号是递增的public DatabaseHelper(Context context, String name, CursorFactory factory,int version) {//必须通过super调用父类当中的构造函数super(context, name, factory, version);// TODO Auto-generated constructor stub}public DatabaseHelper(Context context,String name){this(context,name,VERSION);}public DatabaseHelper(Context context,String name,int version){this(context, name,null,version);}//该函数是在第一次创建数据库的时候执行,实际上是在第一次得到SQLiteDatabse对象的时候,才会调用这个方法@Overridepublic void onCreate(SQLiteDatabase db) {// TODO Auto-generated method stubSystem.out.println("create a Database");//execSQL函数用于执行SQL语句db.execSQL("create table user(id int,name varchar(20))");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// TODO Auto-generated method stubSystem.out.println("update a Database");}}

public class SQLiteActivity extends Activity {    /** Called when the activity is first created. */private Button createButton;private Button insertButton;private Button updateButton;private Button updateRecordButton;private Button queryButton;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        createButton = (Button)findViewById(R.id.createDatabase);        updateButton = (Button)findViewById(R.id.updateDatabase);        insertButton = (Button)findViewById(R.id.insert);        updateRecordButton = (Button)findViewById(R.id.update);        queryButton = (Button)findViewById(R.id.query);        createButton.setOnClickListener(new CreateListener());        updateButton.setOnClickListener(new UpdateListener());        insertButton.setOnClickListener(new InsertListener());        updateRecordButton.setOnClickListener(new UpdateRecordListener());        queryButton.setOnClickListener(new QueryListener());    }    class CreateListener implements OnClickListener{@Overridepublic void onClick(View v) {//创建一个DatabaseHelper对象DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db");//只有调用了DatabaseHelper对象的getReadableDatabase()方法,或者是getWritableDatabase()方法之后,才会创建,或打开一个数据库SQLiteDatabase db = dbHelper.getReadableDatabase();}    }    class UpdateListener implements OnClickListener{@Overridepublic void onClick(View v) {DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db",2);SQLiteDatabase db = dbHelper.getReadableDatabase();}        }    class InsertListener implements OnClickListener{@Overridepublic void onClick(View v) {//生成ContentValues对象ContentValues values = new ContentValues();//想该对象当中插入键值对,其中键是列名,值是希望插入到这一列的值,值必须和数据库当中的数据类型一致values.put("id", 1);values.put("name","zhangsan");DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db",2);SQLiteDatabase db = dbHelper.getWritableDatabase();//调用insert方法,就可以将数据插入到数据库当中db.insert("user", null, values);}    }    //更新操作就相当于执行SQL语句当中的update语句    //UPDATE table_name SET XXCOL=XXX WHERE XXCOL=XX...    class UpdateRecordListener implements OnClickListener{@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stub//得到一个可写的SQLiteDatabase对象DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db");SQLiteDatabase db = dbHelper.getWritableDatabase();ContentValues values = new ContentValues();values.put("name", "zhangsanfeng");//第一个参数是要更新的表名//第二个参数是一个ContentValeus对象//第三个参数是where子句db.update("user", values, "id=?", new String[]{"1"});}    }    class QueryListener implements OnClickListener{@Overridepublic void onClick(View v) {System.out.println("aaa------------------");Log.d("myDebug", "myFirstDebugMsg");DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db");SQLiteDatabase db = dbHelper.getReadableDatabase();Cursor cursor = db.query("user", new String[]{"id","name"}, "id=?", new String[]{"1"}, null, null, null);while(cursor.moveToNext()){String name = cursor.getString(cursor.getColumnIndex("name"));System.out.println("query--->" + name);}}    }    }



使用adb访问SQLite


对SQLite的 crud 操作


创建一个DatabaseHelper对象 创建一张表:

如上例中,点击按钮createButton 触发点击事件CreateListener   

//创建一个DatabaseHelper对象
DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db");

此时并未调用回调函数onCreate()  

 因为只有调用了DatabaseHelper对象的getReadableDatabase()方法,或者是getWritableDatabase()方法之后,才会创建,或打开一个数据库
SQLiteDatabase db = dbHelper.getReadableDatabase();

此时调用了getReadableDatabase()方法,因此系统调用回调函数onCreate()  ,

并执行其中的代码 create table user(id int,name varchar(20))来创建一张名为 test_mars_db 的表,我们可以使用adb来访问SQLite来查看是否已经生成了这张表。


向表中插入一条新数据:

id  , name  是这张表的列名,如果我们想插入的数据是 1,"zhangsan",那么

向表中插入数据时,需要将 被插入数据 放入一个ContentValues对象中,再将这个ContentValues对象插入到SQLiteDatabase 对象中

ContentValues对象类似一个map,我们可以向values 中插入键值对:

ContentValues values = new ContentValues();

values.put("id", 1);
values.put("name","zhangsan");

其中键是列名,值是希望插入到这一列的值,值必须和数据库当中的数据类型一致

新建一个SQLiteOpenHelper 对象: DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db",2);

通过 

SQLiteDatabase db = dbHelper.getWritableDatabase();

获取一个可写的SQLiteDatabase 对象  从而进行插入操作(使用insert("表名",null,ContentValues对象)方法)

db.insert("user", null, values);


更新操作:

修改表中数据

得到一个可写的SQLiteDatabase对象
DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db");
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", "zhangsanfeng");
//第一个参数是要更新的表名

//第二个参数是一个ContentValeus对象

//第三个参数是where子句

//new String[]{"1"} 中的值“1”代表?的值 也就是id=1
db.update("user", values, "id=?", new String[]{"1"});


查询:

//获得助手类对象

DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db");

//获得可写的数据库对象
SQLiteDatabase db = dbHelper.getReadableDatabase();

//将查询结果放入游标中
Cursor cursor = db.query("user", new String[]{"id","name"}, "id=?", new String[]{"1"}, null, null, null);

//cursor.moveToNext()用于判断是否还有下一条数据

//cursor.getColumnIndex("name")   根据列名查询该条数据的对应列的值
while(cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex("name"));
System.out.println("query--->" + name);
}