android平台下数据库的一些概念
Sqlite是android平台的一款轻量级的、嵌入式的、关系型数据库产品,以下是一些主要概念。
1.Sqlite通过文件保存数据库,创建的数据库文件默认存在在/data/data/<package>/databases/的文件
夹下,一个文件就是一个数据库。
2.一个数据库包含多个表格,一个表格包含不同的字段,字段类型等等,这与SQL数据库相似。3.Sqlite记录没有顺序的概念,不存在第一第二类的概念,通过查询获取满足条件的记录。
android平台下操作数据库的的相关类
(1.)SQLiteOpenHelper 抽象类,用于创建和管理数据库以及版本,需要创建一个子类继承,该类封装
了对数据库操作的基本方法,使用方便。
(2.)SQLiteDatabase 数据库访问了,主要是对数据库的增删改查等常用操作,功能比
SQLiteOpenHelper丰富,比如事务管理,分页等等。
(3.)Cursor游标类,主要用来返回返回查询记录结果
SQLiteOpenHelper 类使用方法比较少,网上介绍也比较多,本程序主要采用SQLiteDatabase类操作数
据库,介绍android 平台下Sqlite的多种使用方法。主要功能如图-1界面所示。
图-1 Sqlite数据库界面的操作及其功能
图-2 创建的数据库截图
源码下载: Sqlite.zip
1.对数据库的操作
(1.)创建一个数据库
- //在文件夹/data/data/<package>/databases/创建一个students.db的数据库
- //该类返回一个SQLiteDatabase,对那个数据库操作,就要打开该数据库
- openOrCreateDatabase("students.db",SQLiteDatabase.CREATE_IF_NECESSARY, null);
(2.)删除一个数据库
- //在Context环境中,删除students.db,该方法返回一个boolean类型
- deleteDatabase("students.db");
(3.)获取应用程序所有数据库的名称
- //在Context环境中,获取该应用程序的所有数据库名称(即databases文件夹下的数据库文件)
- //该方法返回一个字符串数组
- databaseList()
(4.)重命名一个数据库
- //将数据库data.db重命名为renamedata.db
- File f = getDatabasePath("data.db");
- File renameFile=getDatabasePath("renamedata.db");
- f.renameTo(renameFile);
2.对表的操作
(1.)创建一个表(sql语句中创建)
- mDb.execSQL("create table if not exists "+table+
- " (id integer primary key autoincrement, "
- + "username text not null, info text not null);");
(2.)删除一个表
- mDb.execSQL("drop table if exists " + table);
(3.)修改表
Sqlite是不能修改一个表的字段,不能删除一个表的字段,但是可以重命名一个表的名称,可以添加一
个字段及其属性
1.)重命名表
- mDb.execSQL("alter table " + oldTable + " rename to "+ newTableName+";");
2.)添加一列
- mDb.execSQL("alter table " + table + " add column " + column + type + " ;");
(4.)获取一个数据库的所有表的名称
- mDb.rawQuery("select name from sqlite_master where type='table' order by name",null);
3.对数据库记录的操作
(1.)添加一条记录
- ContentValues values = new ContentValues();
- values.put("username", user.getUsername());
- values.put("info", user.getInfo());
- mDb.insert(table, null, values);
(2.)删除一条记录
- String whereClause = "id=?";
- String[] whereArgs = new String[] {String.valueOf(id)};
- mDb.delete(table, whereClause, whereArgs);
(3.)修改一条记录
- ContentValues values = new ContentValues();
- values.put("username", username);
- values.put("info", info);
- String whereClause = "id=?";
- String[] whereArgs = new String[] { String.valueOf(id) };
- mDb.update(table, values, whereClause, whereArgs);
(4.)查询一条数据
- String[] columns = new String[] { "id", "username", "info" };
- String selection = "id=?";
- String[] selectionArgs = { String.valueOf(id) };
- String groupBy = null;
- String having = null;
- String orderBy = null;
- mDb.query(table, columns, selection,selectionArgs, groupBy, having, orderBy);
(5.)查询所有记录
- mDb.rawQuery("select * from "+table, null);
SqliteActivity源码类如下(注意:在点击对数据记录的增删改查时要先create table ,否则会因为无法找到mytable表而报错)
SqliteActivity.java
- package com.sqlite.main;
- import java.io.File;
- import android.app.Activity;
- import android.content.ContentValues;
- import android.database.Cursor;
- import android.database.SQLException;
- import android.database.sqlite.SQLiteDatabase;
- import android.os.Bundle;
- import android.text.Html;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.TextView;
- import android.widget.Toast;
- public class SqliteActivity extends Activity {
- /** Called when the activity is first created. */
- //SQLiteDatabase 引用
- SQLiteDatabase mDb;
- SQLiteDatabaseDao dao;
- //显示结果
- TextView show;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- //默认创建一个users.db的数据库
- dao=new SQLiteDatabaseDao();
- //创建一个数据库
- Button createDatabase=(Button)findViewById(R.id.createdatabase);
- createDatabase.setOnClickListener(createDatabaseClick);
- //获取所有数据库
- Button getDatabasesList=(Button)findViewById(R.id.getdatabaseslist);
- getDatabasesList.setOnClickListener(getDatabaseListClick);
- //重命名数据库
- Button renameDatabase=(Button)findViewById(R.id.renamedatabase);
- renameDatabase.setOnClickListener(renameDatabaseClick);
- //删除一个数据库
- Button removeDatabase=(Button)findViewById(R.id.removedatabase);
- removeDatabase.setOnClickListener(removeDatabaseClick);
- //创建一个表
- Button createTable=(Button)findViewById(R.id.createtable);
- createTable.setOnClickListener(createTableClick);
- //获取所有的表
- Button getTablesList=(Button)findViewById(R.id.gettableslist);
- getTablesList.setOnClickListener(getTablesListClick);
- //重命名一个表
- Button renameTable=(Button)findViewById(R.id.renametable);
- renameTable.setOnClickListener(renameTableClick);
- //删除一个表
- Button dropTable=(Button)findViewById(R.id.droptable);
- dropTable.setOnClickListener(dropTableClick);
- //为表添加一个字段
- Button addTableColumn=(Button)findViewById(R.id.addtablecolumn);
- addTableColumn.setOnClickListener(addTableColumnClick);
- //获取表的所有列
- Button getTableColumnsList=(Button)findViewById(R.id.gettablecolumnslist);
- getTableColumnsList.setOnClickListener(getTableColumnsListClick);
- //插入一条数据
- Button insertTable=(Button)findViewById(R.id.inserttable);
- insertTable.setOnClickListener(insertTableClick);
- //查询一条数据
- Button queryTable=(Button)findViewById(R.id.querytable);
- queryTable.setOnClickListener(queryTableClick);
- //更新一条数据
- Button updateTable=(Button)findViewById(R.id.updatetable);
- updateTable.setOnClickListener(updateTableClick);
- //删除一条数据
- Button delete=(Button)findViewById(R.id.delete);
- delete.setOnClickListener(deleteClick);
- //显示结果
- show=(TextView)findViewById(R.id.showresult);
- }
- /************对按钮事件进行操作的事件响应****************/
- //创建一个数据库
- OnClickListener createDatabaseClick=new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- //创建一个名为students.db的数据库,主要是生成另外一个数据库以示区别
- openOrCreateDatabase("students.db",
- SQLiteDatabase.CREATE_IF_NECESSARY, null);
- show.setText("创建的数据库路径为\n"
- +getDatabasePath("students.db"));
- }
- };
- //创建一个应用程序数据库的个数(list)的事件响应
- OnClickListener getDatabaseListClick=new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- String []dblist=dao.getDatabasesList();
- String rs="";
- for(String s:dblist){
- rs+=s+"\n";
- }
- show.setText("数据库名称为:\n"+ rs);
- }
- };
- //重命名一个数据库的事件响应
- OnClickListener renameDatabaseClick=new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- //创建一个data.db的数据库,并命名为renamedata.db数据库
- openOrCreateDatabase("data.db",
- SQLiteDatabase.CREATE_IF_NECESSARY, null);
- File f = getDatabasePath("data.db");
- File renameFile=getDatabasePath("renamedata.db");
- boolean b=f.renameTo(renameFile);
- if(b)
- show.setText("data.db已经重命名为renamedata.db");
- else
- show.setText("无法重命名");
- }
- };
- //删除一个数据库的事件响应
- OnClickListener removeDatabaseClick=new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- //删除students.db数据库
- dao.dropDatabase("students.db");
- //重新获取数据库名称
- String []dblist=dao.getDatabasesList();
- String rs="";
- for(String s:dblist){
- rs+=s+"\n";
- }
- show.setText("数据库students.db已经删除\n现在数据库的名称为:\n"+rs);
- }
- };
- //创建一个表的事件响应
- OnClickListener createTableClick=new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- //在user.db数据库中插入mytable表,并添加相应的字段
- dao.createTable(mDb, "mytable");
- show.setText("数据库students.db已经创建mytable表\n");
- }
- };
- //获取一个数据库的所有表个数(list)的事件响应
- OnClickListener getTablesListClick=new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- //显示所有的表的数据
- String tableNames=dao.getTablesList(mDb);
- show.setText(tableNames);
- }
- };
- //重命名一个表的事件响应
- OnClickListener renameTableClick=new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- //创建一个testtable的表
- dao.createTable(mDb, "testtable");
- //将testtable重命名为newtable
- boolean b=dao.alterTableRenameTable(mDb, "testtable", "newtable");
- if(b)show.setText("testtable已经重命名为\nnewtable表\n");
- else show.setText("newtable已经存在\n请删除(drop table)后重试");
- }
- };
- //删除一个表的事件响应
- OnClickListener dropTableClick=new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- //删除 newtable表
- dao.dropTable(mDb, "newtable");
- //显示所有的表的数据
- String tableNames=dao.getTablesList(mDb);
- show.setText("newtable已经删除\n现在表名称为:\n"+tableNames);
- }
- };
- //修改一个表(给表添加一个字段)的事件响应
- OnClickListener addTableColumnClick=new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- //默认添加一个password字段,类型为varchar,长度为30
- boolean b=dao.alterTableAddColumn(mDb, "mytable", "password", " varchar(30)");
- if(b)show.setText("已经添加password字段\n字符类型为:varchar\n长度为:30");
- else show.setText("mytable表中password字段已经存在");
- }
- };
- //获取一个表的所有列的名称事件响应
- OnClickListener getTableColumnsListClick=new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- String str=dao.getTableColumns(mDb);
- show.setText("mytable表的列名:\n"+str);
- }
- };
- //对一个表添加一个数据的事件响应
- OnClickListener insertTableClick=new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- User user=new User();
- user.setUsername("Mr.Young");
- user.setInfo("好学生");
- dao.insert(mDb, "mytable", user);
- Cursor c=dao.getAllData(mDb, "mytable");
- if(c.moveToLast()){
- String id=c.getString(0);
- String username=c.getString(1);
- String info=c.getString(2);
- show.setText("最新添加的一条数据:\n"+"id:"+id+"\nusername:"+username+"\ninfo:"+info);
- }
- }
- };
- //查询一个表的所有数据记录的事件响应
- OnClickListener queryTableClick=new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- //默认查询mytable所有数据
- Cursor c=dao.getAllData(mDb, "mytable");
- String s="";
- int columnsSize=c.getColumnCount();
- String []columns=c.getColumnNames();
- String columnsName="";
- //获取表头
- for (String col : columns) {
- columnsName+=col+"\u0020 \u0020";
- }
- //获取表的内容
- while(c.moveToNext()){
- for(int i=0;i<columnsSize;i++){
- s+=c.getString(i)+"\u0020 \u0020";
- }
- s+="<br>";
- }
- show.setText(Html.fromHtml("<h5>"+columnsName+"</h5>"+s));
- }
- };
- //更新一个表的数据的事件响应
- OnClickListener updateTableClick=new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- Cursor c=dao.getAllData(mDb, "mytable");
- if(c.moveToFirst()){
- int first=Integer.valueOf(c.getString(0));
- //默认修改第一条记录
- dao.update(mDb, "mytable", first, "Yong Ming", "学习成绩优异");
- Cursor u=dao.queryById(mDb, "mytable", first);
- u.moveToFirst();
- show.setText("id为:"+first+"的记录已经修改:\nid:"+first+"\nusername:"+u.getString(1)+"\ninfo:"+u.getString(2));
- }else
- show.setText("没有要更新的记录!请添加数据后再作修改");
- }
- };
- //删除一个表的一条数据的事件响应
- OnClickListener deleteClick=new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- Cursor c=dao.getAllData(mDb, "mytable");
- if(c.moveToLast()){
- int last=Integer.valueOf(c.getString(0));
- //默认删除最后一条记录
- boolean b=dao.delete(mDb, "mytable", last);
- if(b)
- show.setText("成功删除id为:\n"+last+"的记录!");
- }
- else
- show.setText("没有要删除的记录!");
- }
- };
- //退出时关闭数据库
- @Override
- public void finish() {
- // TODO Auto-generated method stub
- super.finish();
- mDb.close();
- }
- /*******************
- *
- *
- *
- * 对Sqlite数据库进行操作的类
- *
- *
- *
- * ****************/
- class SQLiteDatabaseDao {
- public SQLiteDatabaseDao(){
- mDb=openOrCreateDatabase("users.db",
- SQLiteDatabase.CREATE_IF_NECESSARY, null);
- }
- /************ 对数据库的操作 ***********************/
- // 获取所有数据库的名称
- public String[] getDatabasesList() {
- return databaseList();
- }
- // 创建一个数据库
- public void createDatabase(String db) {
- openOrCreateDatabase(db, SQLiteDatabase.CREATE_IF_NECESSARY, null);
- }
- // 删除一个数据库
- public void dropDatabase(String db) {
- try {
- deleteDatabase(db);
- } catch (SQLException e) {
- Toast.makeText(getApplicationContext(), "删除数据库失败",
- Toast.LENGTH_LONG).show();
- }
- }
- /************ 对数据库的表的属性添加修改操作 ***********************/
- // 获取某个数据库的表的名称
- public String getTablesList(SQLiteDatabase mDb) {
- Cursor c = mDb
- .rawQuery(
- "select name from sqlite_master where type='table' order by name",
- null);
- String str="";
- while (c.moveToNext()) {
- str+=c.getString(0)+"\n";
- }
- return "表的名称为:\n"+str;
- }
- // 创建一个表,默认创建一个username info字段的表,可以在后面的代码中添加相应的列
- public void createTable(SQLiteDatabase mDb, String table) {
- try {
- mDb.execSQL("create table if not exists "+table+
- " (id integer primary key autoincrement, "
- + "username text not null, info text not null);");
- } catch (SQLException e) {
- Toast.makeText(getApplicationContext(), "数据表创建失败",
- Toast.LENGTH_LONG).show();
- }
- }
- // 删除一个表
- public void dropTable(SQLiteDatabase mDb, String table) {
- try {
- mDb.execSQL("drop table if exists " + table);
- } catch (SQLException e) {
- Toast.makeText(getApplicationContext(), "数据表删除失败",
- Toast.LENGTH_LONG).show();
- }
- }
- // 修改表--重命名表名
- public boolean alterTableRenameTable(SQLiteDatabase mDb, String oldTable,
- String newTableName) {
- try {
- mDb.execSQL("alter table " + oldTable + " rename to "
- + newTableName+";");
- } catch (SQLException e) {
- Toast.makeText(getApplicationContext(), "数据表重命名失败",
- Toast.LENGTH_LONG).show();
- return false;
- }
- return true;
- }
- // 修改表--添加一列
- // @table 需要修改的table名
- // @column 添加的列的名称
- // @type 列的类型,如text,varchar等
- public boolean alterTableAddColumn(SQLiteDatabase mDb, String table,
- String column, String type) {
- try {
- mDb.execSQL("alter table " + table + " add column " + column
- + type + " ;");
- } catch (SQLException e) {
- Toast.makeText(getApplicationContext(), "数据表添加失败",
- Toast.LENGTH_LONG).show();
- return false;
- }
- return true;
- }
- // 获取表的列的名称
- public String getTableColumns(SQLiteDatabase mDb) {
- Cursor c=dao.getAllData(mDb, "mytable");;
- String []columns=c.getColumnNames();
- String str="";
- for (String s : columns) {
- str+=s+"\n";
- }
- return str;
- }
- /************ 对数据库的表数据增删改查操作 ***********************/
- // 添加一条数据,默认只向username和info字段添加数据
- public long insert(SQLiteDatabase mDb,String table,User user) {
- ContentValues values = new ContentValues();
- values.put("username", user.getUsername());
- values.put("info", user.getInfo());
- return mDb.insert(table, null, values);
- }
- /*
- *
- * 删除一条数据
- */
- public boolean delete(SQLiteDatabase mDb,String table,int id) {
- String whereClause = "id=?";
- String[] whereArgs = new String[] {String.valueOf(id)};
- try{
- mDb.delete(table, whereClause, whereArgs);
- }catch (SQLException e) {
- Toast.makeText(getApplicationContext(), "删除数据库失败",
- Toast.LENGTH_LONG).show();
- return false;
- }
- return true;
- }
- /*
- *
- * 修改一条数据
- */
- public void update(SQLiteDatabase mDb,String table,int id,String username,String info)
- {
- ContentValues values = new ContentValues();
- values.put("username", username);
- values.put("info", info);
- String whereClause = "id=?";
- String[] whereArgs = new String[] { String.valueOf(id) };
- mDb.update(table, values, whereClause, whereArgs);
- }
- public Cursor queryById(SQLiteDatabase mDb,String table,int id) {
- // 第一个参数String:表名
- // 第二个参数String[]:要查询的列名
- // 第三个参数String:查询条件
- // 第四个参数String[]:查询条件的参数
- // 第五个参数String:对查询的结果进行分组
- // 第六个参数String:对分组的结果进行限制
- // 第七个参数String:对查询的结果进行排序
- String[] columns = new String[] { "id", "username", "info" };
- String selection = "id=?";
- String[] selectionArgs = { String.valueOf(id) };
- String groupBy = null;
- String having = null;
- String orderBy = null;
- return mDb.query(table, columns, selection,
- selectionArgs, groupBy, having, orderBy);
- }
- public Cursor getAllData(SQLiteDatabase mDb,String table) {
- //遍历表所有数据
- return mDb.rawQuery("select * from "+table, null);
- /** 如果需要返回指定的列,则执行以下语句
- String[] columns = new String[] { "id","username", "info" };
- // 调用SQLiteDatabase类的query函数查询记录
- return mDb.query(table, columns, null, null, null, null,
- null);
- */
- }
- }
- }