Android数据库基本操作(附源码)

来源:互联网 发布:楼市崩盘的后果 知乎 编辑:程序博客网 时间:2024/06/04 20:23


数据库是程序开发中重要的知识点,Android采用的数据库是SQLite这个轻量级的嵌入式开源数据库,数据库基本的操作就是先创建表,再对表中的数据进行"增,删,改,插".

1,创建表

通过execSQL方法来执行一条SQL语句。

String sql = "CREATE TABLE dota (_id INTEGER , heroname VARCHAR,description VARCHAR)";db.execSQL(sql);
上面就创建了一个表名为"dota"的表,有3列,分别是"INTEGER"数据类型的"id"列,"VARCHAR"数据类型的"heroname"列,

"VARCHAR"数据类型的"description"列

语法结构是:Create TABLE 表名(列名 此列数据类型,列名 此列数据类型,列名 此列数据类型)


补充:在创建表时,还可以把第一列Id设置为主键,一个自增长字段定义为INTEGER PRIMARY KEY AUTOINCREMENT,那么在插入一个新数据时,只需要将这个字段的值指定为NULL,即可由引擎自动设定其值

String sql = "CREATE TABLE dota (_id INTEGER PRIMARY KEY AUTOINCREMENT, heroname VARCHAR,description VARCHAR)";db.execSQL(sql);

大家可以用这2种方式创建表试下,就可以理解区别了.上传的源代码中是没有加入"PRIMARY KEY AUTOINCREMENT"的

关于详细的解释,可以看下面朋友发的文章

点击打开链接


2,增加数据

2种方法

ContentValues cv = new ContentValues();cv.put("heroname", "幽鬼");cv.put("description", "1号位");db.insert(table_name, "", cv);
db.execSQL("INSERT INTO dota(heroname, description) values('幽鬼', '1号位')");
第二种方法固定语法结构:INSERT INTO 表名(列名, 列名) values(键值, 键值)


3,删除数据

2种方法

db.delete(table_name, "description = '5号位'", null);
db.execSQL("delete from dota where description=?",new Object[]{"5号位"});
第二种方法固定语法结构:"delete from 表名 where 列名=?",new Object[]{键值}


4,修改数据

2种方法

cv.put("heroname", "神牛");cv.put("description", "8号位");db.update(table_name, cv, "heroname = '神牛'", null);
db.execSQL("update dota set description=? where heroname=?",new String[]{"8号位", "神牛"});
第二种方法固定语法结构:"update 表名 set 列名=? where 列名=?",new String[]{"要修改的键值", "键值"}


5,查询数据

2种方法

Cursor c = db.query(table_name, null, null, null, null, null, null);
Cursr c = db.rawQuery("select * from dota", null);
第二种方法固定语法结构:"select"表中哪一行查询或者全表查询,返回一个游标,这里查询的是表中所有数据

除了了解数据库的基本操作语句外,还需要明白SQLiteOpenHelper类和SQLiteDatabase类.

SQLiteOpenHelper帮助你创建一个数据库你只要继承 SQLiteOpenHelper类就可以轻松的创建数据库。SQLiteOpenHelper类根据开发应用程序的需要封装了创建和更新数据库使用的逻辑。

SQLiteOpenHelper 的子类,至少需要实现三个方法:

  构造函数,调用父类 SQLiteOpenHelper 的构造函数

  onCreate()方法;// TODO 创建数据库后,对数据库的操作

  onUpgrage()方法。// TODO 更改数据库版本的操作

SQLiteDatabase是在android中数据库操作使用最频繁的一个类。通过它可以实现数据库的创建或打开、创建表、插入数据、删除数据、查询数据、修改数据等操作.例如上面的代码中的"db"就是SQLiteDatabase类的对象.

下面直接贴代码:

DbHelper.java

package com.example.mysqliteactivity;import android.content.Context;import android.database.DatabaseErrorHandler;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;public class DbHelper extends SQLiteOpenHelper{public DbHelper(Context context, String name, CursorFactory factory,int version) {super(context, name, factory, version);// TODO Auto-generated constructor stub}@Overridepublic void onCreate(SQLiteDatabase db) {// TODO Auto-generated method stubString sql = "CREATE TABLE dota (_id INTEGER , heroname VARCHAR,description VARCHAR)";db.execSQL(sql);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// TODO Auto-generated method stub}}


MainActivity,java
package com.example.mysqliteactivity;import java.util.ArrayList;import android.os.Bundle;import android.app.Activity;import android.content.ContentValues;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.support.v4.widget.SimpleCursorAdapter;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.AdapterView;import android.widget.AdapterView.OnItemSelectedListener;import android.widget.ArrayAdapter;import android.widget.Button;import android.widget.Spinner;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity {//SQLiteDatabase对象SQLiteDatabase db;//数据库名public String db_name = "huahua.sqlite";//表名public String table_name = "dota";//辅助类名final DbHelper helper = new DbHelper(this,db_name,null,1);//保存数据库中英雄名字的ArrayListpublic ArrayList<String> heronames =new ArrayList<String>(); @Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();db.delete(table_name, null, null);UpdateSpinner();}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//UI组件Button b1 = (Button)findViewById(R.id.Button01);Button b2 = (Button)findViewById(R.id.Button02);Button b3 = (Button)findViewById(R.id.Button03);Button b4 = (Button)findViewById(R.id.Button04);//从辅助类获得数据库对象db = helper.getWritableDatabase();//初始化数据initDatabase(db);//更新下拉列表数据UpdateSpinner();//定义按钮点击监听器OnClickListener ocl = new OnClickListener() {ContentValues cv = new ContentValues();@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch(v.getId()){//增加按钮case R.id.Button01://cv.put("heroname", "随机英雄");//cv.put("description", "6号位");//long long1 = db.insert(table_name, "", cv);db.execSQL("INSERT INTO dota(heroname, description) values(?, ?)",new Object[]{"随机英雄", "6'号'位"});//添加成功后返回行号,添加失败后返回-1//if(long1 == -1){//Toast.makeText(MainActivity.this, "ID是"+long1+"的图片添加失败", Toast.LENGTH_LONG).show();//}else{//Toast.makeText(MainActivity.this, "ID是"+long1+"的图片添加成功", Toast.LENGTH_LONG).show();//}//更新下拉列表UpdateSpinner();break;//删除描述是"图片5"的数据行case R.id.Button02://删除方法//long long2 = db.delete(table_name, "description = '5号位'", null);db.execSQL("delete from dota where description=?",new Object[]{"5号位"});//这里删除的是"术士"项//删除失败返回0,成功返回删除的条数//Toast.makeText(MainActivity.this, "删除了"+long2+"条记录", Toast.LENGTH_LONG).show();//更新下拉列表UpdateSpinner();break;//更新文件名是"5.png"的数据行case R.id.Button03://cv.put("heroname", "神牛");//cv.put("description", "8号位");//long long3 = db.update(table_name, cv, "heroname = '神牛'", null);db.execSQL("update dota set description=? where heroname=?",new String[]{"8号位", "神牛"});//更新失败返回0,成功返回更新的条数//Toast.makeText(MainActivity.this, "更新了"+long3+"条记录", Toast.LENGTH_LONG).show();//更新下拉列表UpdateSpinner();break;//查询当前所有数据case R.id.Button04://查询表中所有元素//Cursor c = db.query(table_name, null, null, null, null, null, null);Cursor c = db.rawQuery("select * from dota", null); //查询指定的元素//Cursor c = db.rawQuery("select * from dota where heroname=? ", new String[]{"修补匠"}); //Cursor c = db.rawQuery("select * from dota where heroname= ? and description=?", new String[]{"修补匠","2号位"}); //Cursor.getCount是记录的条数Toast.makeText(MainActivity.this, "当前共有"+c.getCount()+"条记录,下面一一显示", Toast.LENGTH_SHORT).show();//循环显示for(c.moveToFirst();!c.isAfterLast();c.moveToNext()){Toast.makeText(MainActivity.this,"第"+c.getInt(0)+"条记录,英雄是"+c.getString(1)+",位置是"+c.getString(2),Toast.LENGTH_SHORT).show();//更新下拉列表//UpdateSpinner();}//更新下拉列表UpdateSpinner();break;}}};b1.setOnClickListener(ocl);b2.setOnClickListener(ocl);b3.setOnClickListener(ocl);b4.setOnClickListener(ocl);}private void UpdateSpinner() {// TODO Auto-generated method stub//定义组件;final TextView tv = (TextView)findViewById(R.id.TextView02);Spinner s = (Spinner)findViewById(R.id.Spinner01);//从数据库中获取数据放入游标Cursor对象final Cursor c = db.query(table_name, null, null, null, null, null, null);heronames.clear();for(c.moveToFirst();!c.isAfterLast();c.moveToNext()){heronames.add(c.getString(1));}////创建简单游标适配器//SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,//android.R.layout.simple_spinner_item, //c, //new String[]{"heroname","description"},//new int[]{R.id.TextView01,R.id.TextView02});//创建Spinner的适配器ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,heronames);adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);//给下拉列表设置适配器s.setAdapter(adapter);//设置点击子元素监听器OnItemSelectedListener oisl = new OnItemSelectedListener() {@Overridepublic void onItemSelected(AdapterView<?> arg0, View arg1,int arg2, long arg3) {// TODO Auto-generated method stubc.moveToPosition(arg2);tv.setText("当前英雄位置描述为:" + c.getString(2));}@Overridepublic void onNothingSelected(AdapterView<?> arg0) {// TODO Auto-generated method stub}};//给下拉列表设置监听器s.setOnItemSelectedListener(oisl);}private void initDatabase(SQLiteDatabase db) {// TODO Auto-generated method stub//ContentValues cv = new ContentValues();////cv.put("heroname", "幽鬼");//cv.put("description", "1号位");//db.insert(table_name, "", cv);////cv.put("heroname", "修补匠");//cv.put("description", "2号位");//db.insert(table_name, "", cv);////cv.put("heroname", "发条");//cv.put("description", "3号位");//db.insert(table_name, "", cv);////cv.put("heroname", "神牛");//cv.put("description", "4号位");//db.insert(table_name, "", cv);//cv.put("heroname", "术士");//cv.put("description", "5号位");//db.insert(table_name, "", cv);//用execSQL语法操作更方便,如果传入带'单引号的特殊符号字符串要用以下结构,不然会出现语法错误db.execSQL("insert into dota(heroname, description) values(?,?)", new Object[]{"幽鬼", "1号'位"}); //db.execSQL("INSERT INTO dota(heroname, description) values('幽鬼', '1号'位')");//这句导致程序崩溃!!!db.execSQL("INSERT INTO dota(heroname, description) values('修补匠', '2号位')");db.execSQL("INSERT INTO dota(heroname, description) values('发条', '3号位')");db.execSQL("INSERT INTO dota(heroname, description) values('神牛', '4号位')");db.execSQL("INSERT INTO dota(heroname, description) values('术士', '5号位')");}}

就只有2个类,如有错误或者疑问的地方,大家可以指出来一起纠正,讨论

以下是源码的下载地址

点击打开链接