Android内置的轻量级数据库SQLite,是Android五种数据存储方式中的一种。Android提供了类SQLiteDatabase,里面封装了一些数据库的API,可以用于对数据库进行增、删、改、查。Android还提供了类SQLiteOpenHelper,是SQLiteDatabase的辅助类,主要用于创建数据库,并对数据库的版本进行管理。该类是一个抽象类,使用时一般定义一个类继承SQLiteOpenHelper,并实现两个回调方法OnCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase,int oldVersion,int newVersion)来创建和更新数据库。
一、在项目中编写代码创建数据库、数据表
Android Studio中新建项目:
新建包:utils,在utils下面新建class文件:DBAdapter,用于完成数据库及表的建立、更新、删除操作,以及对数据的增删改查
package com.example.zwl.myapp.utils;
import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
public class DBAdapter {
private static final String DB_NAME = "order.db"; //数据库库名
public static final String User_TABLE = "user"; //用户数据表
private static final int DB_VESSION = 1; //数据库版本
public static final String NAME = "username"; //用户数据表字段名
public static final String PASSWORD = "password"; //用户数据表字段名
public static final String CARTID = "cartId"; //用户数据表字段名
private SQLiteDatabase db;
private final Context context;
private DBOpenHelper dbOpenHelper;
public DBAdapter(Context context) {
this.context = context;
}
//关闭数据库
public void close(){
if (db!=null){
db.close();
db = null;
}
}
//创建及打开数据库
public void open()throws SQLException{
dbOpenHelper = new DBOpenHelper(context,DB_NAME,null,DB_VESSION);
try {
//调用getWritableDatabase()或getReadableDatabase()时才会执行onCreate()
db = dbOpenHelper.getWritableDatabase();
}catch (SQLException ex){
db = dbOpenHelper.getReadableDatabase();
}
}
//删除数据库
public void delete() throws SQLException{
context.deleteDatabase(DB_NAME);
}
//创建数据表
public void create_table(String createTableSql) throws SQLException{
db.execSQL(createTableSql);
}
//删除数据表
public void drop_table(String tableName) throws SQLException{
db.execSQL("DROP TABLE IF EXISTS "+tableName);
}
}
创建DBOpenHelper类继承SQLiteOpenHelper:
package com.example.zwl.myapp.utils;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DBOpenHelper extends SQLiteOpenHelper {
public DBOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
private static final String User_CREATE = "create table "+ DBAdapter.User_TABLE + " (" + DBAdapter.NAME + " VARCHAR PRIMARY KEY,"+ DBAdapter.PASSWORD + " text not null," + DBAdapter.CARTID + " text not null);";
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(User_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS "+DBAdapter.User_TABLE);
onCreate(db);
}
}
在MainActivity中调用:
package com.example.zwl.myapp;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.example.zwl.myapp.utils.DBAdapter;
public class MainActivity extends AppCompatActivity {
private DBAdapter dbAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbAdapter.open();
dbAdapter.close();
}
}
二、查看建好的数据表
创建好的数据库文件会存放在\data\data\<包名>\databases中,cmd中输入adb shell:
查看user表的结构:
三、控制台操作数据库
在控制台向user表插入数据,在AS中打印出,首先先插入数据并在cmd中查看:
AS中创建包:bean用于存放orm关系映射类,包下新建类User:
package com.example.zwl.myapp.bean;
public class User {
public String username;
public String password;
public String cartId;
}
在DBAdapter.java代码增加两个方法用于查询数据:
//查询user表中一条数据
public User queryOneData(String username) throws SQLException{
Cursor results = db.query(User_TABLE,new String[]{NAME,PASSWORD,CARTID},NAME + " = " + '"' + username + '"' ,null,null,null,null);
return ConertToUser(results);
}
//将查询结果转换为User类型
private User ConertToUser(Cursor cursor) {
// 获得游标集的记录数
int resultCounts = cursor.getCount();
//如果游标集的记录数为0或者游标不在第一行记录,则返回null
if(resultCounts==0||!cursor.moveToFirst()){
return null;
}
// 创建User实体类
User theUser = new User();
//这里一开始游标指向结果集第一行,而这里的功能时查询一条数据,故直接获取通过属性序号获得对应值
// cursor.getColumnIndex(属性名):返回指定属性名称的序号
theUser.username = cursor.getString(cursor.getColumnIndex(NAME));
theUser.password = cursor.getString(cursor.getColumnIndex(PASSWORD));
theUser.cartId = cursor.getString(cursor.getColumnIndex(CARTID));
return theUser;
}
修改MainActivity如下:
package com.example.zwl.myapp;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.example.zwl.myapp.utils.DBAdapter;
import com.example.zwl.myapp.bean.User;
public class MainActivity extends AppCompatActivity {
private DBAdapter dbAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbAdapter.open();
User mUser = dbAdapter.queryOneData("admin");
dbAdapter.close();
Log.i("user表中的数据:",mUser.username+","+mUser.password+","+mUser.cartId);
}
}
在AS中打印:
四、Android Studio中编写代码操作数据库
不想在控制台插入数据的,可以选择AS中编写代码进行插入操作。在DBAdapter.java代码增加插入数据库方法:
public long insert(User user){
//ContentValues对象,即键值对的字段名称,键名为表中的字段,键值为要增加的记录数据值,通过该对象的put()将数据存放到ContentValues对象中
ContentValues newValues = new ContentValues();
newValues.put(NAME,user.username);
newValues.put(PASSWORD,user.password);
newValues.put(CARTID,user.cartId);
//返回值:返回插入记录所在行的行号,如果插入失败则返回-1
return db.insert(User_TABLE,null,newValues);
}
在MainActivity中使用如下:
package com.example.zwl.myapp;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.example.zwl.myapp.utils.DBAdapter;
import com.example.zwl.myapp.bean.User;
public class MainActivity extends AppCompatActivity {
private DBAdapter dbAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbAdapter.open();
User theUser = new User();
theUser.username = "test";
theUser.password = "456";
theUser.cartId = "181115002";
dbAdapter.insert(theUser);
User mUser = dbAdapter.queryOneData("test");
dbAdapter.close();
Log.i("user表中的数据:",mUser.username+","+mUser.password+","+mUser.cartId);
}
运行结果如下: