android和ios的数据库都是用SQLite来实现。
在安卓里面数据库怎么用呢,简单来说可用分为以下三步:
1、新建一个数据库帮助类,继承自SQLiteOpenHelper,复写onCreate() 和 onUpgrade()
2、新建一个数据里操作类(dao类),利用 数据库帮助类 得到数据库的实例,然后在dao类里面编写 增删改查 的方法
3、在Activity里面实例化数据库操作类(dao类),调用对应的 增删查改方法。
Android数据的具体使用(原生数据库操作类)
1、编写数据库帮助类
· 新建一个数据库帮助类,继承自SQLiteOpenHelper
· 编写构造函数
· 复写onCreate() 和 onUpgrade()
代码如下:
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class MyDBHelper extends SQLiteOpenHelper{
public MyDBHelper(Context context) {
/**
* 参数说明:
*
* 第一个参数: 上下文
* 第二个参数:数据库的名称
* 第三个参数:null代表的是默认的游标工厂
* 第四个参数:是数据库的版本号 数据库只能升级,不能降级,版本号只能变大不能变小
*/
super(context, "mintest.db", null, 2);
}
/**
* onCreate是在数据库创建的时候调用的,主要用来初始化数据表结构和插入数据初始化的记录
*
* 当数据库第一次被创建的时候调用的方法,适合在这个方法里面把数据库的表结构定义出来.
* 所以只有程序第一次运行的时候才会执行
* 如果想再看到这个函数执行,必须写在程序然后重新安装这个app
*/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table contactinfo (id integer primary key autoincrement, name varchar(20), phone varchar(20))");
}
/**
* 当数据库更新的时候调用的方法
* 这个要显示出来得在上面的super语句里面版本号发生改变时才会 打印 (super(context, "itheima.db", null, 2); )
* 注意,数据库的版本号只可以变大,不能变小,假设我们当前写的版本号是3,运行,然后又改成1,运行则报错。不能变小
* @param db
* @param oldVersion
* @param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("alter table contactinfo add account varchar(20)");
}
}
2、数据库操作类(dao类)
dao类在这里做得事情特别简单:
· 1、定义一个构造方法,利用这个方法去实例化一个 数据库帮助类
· 2、编写dao类的对应的 增删改查 方法。
代码如下:
package amqr.com.dbanddao.dao;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import amqr.com.dbanddao.db.MyDBHelper;
/**
* ContactInjfoDao 数据库操作类 dao后缀的都是数据库操作类
*
* 我们这里的每一个 增删改查 的方法都通过getWritableDatabase()去实例化了一个数据库,这里必须这么做
* 不客气抽取 成为一个成员变量, 否则报错,若是觉得麻烦可以通过定义方法来置为null和重新赋值
*
* —— 其实dao类在这里做得事情特别简单:
* 1、定义一个构造方法,利用这个方法去实例化一个 数据库帮助类
* 2、编写dao类的对应的 增删改查 方法。
*
*/
public class ContactInjfoDao {
private MyDBHelper mMyDBHelper;
/**
* dao类需要实例化数据库Help类,只有得到帮助类的对象我们才可以实例化 SQLiteDatabase
* @param context
*/
public ContactInjfoDao(Context context) {
mMyDBHelper=new MyDBHelper(context);
}
// 将数据库打开帮帮助类实例化,然后利用这个对象
// 调用谷歌的api去进行增删改查
// 增加的方法吗,返回的的是一个long值
public long addDate(String name,String phone){
// 增删改查每一个方法都要得到数据库,然后操作完成后一定要关闭
// getWritableDatabase(); 执行后数据库文件才会生成
// 数据库文件利用DDMS可以查看,在 data/data/包名/databases 目录下即可查看
SQLiteDatabase sqLiteDatabase = mMyDBHelper.getWritableDatabase();
ContentValues contentValues=new ContentValues();
contentValues.put("name",name);
contentValues.put("phone", phone);
// 返回,显示数据添加在第几行
// 加了现在连续添加了3行数据,突然删掉第三行,然后再添加一条数据返回的是4不是3
// 因为自增长
long rowid=sqLiteDatabase.insert("contactinfo",null,contentValues);
sqLiteDatabase.close();
return rowid;
}
// 删除的方法,返回值是int
public int deleteDate(String name){
SQLiteDatabase sqLiteDatabase = mMyDBHelper.getWritableDatabase();
int deleteResult = sqLiteDatabase.delete("contactinfo", "name=?", new String[]{name});
sqLiteDatabase.close();
return deleteResult;
}
/**
* 修改的方法
* @param name
* @param newPhone
* @return
*/
public int updateData(String name,String newPhone){
SQLiteDatabase sqLiteDatabase = mMyDBHelper.getWritableDatabase();
ContentValues contentValues =new ContentValues();
contentValues.put("phone", newPhone);
int updateResult = sqLiteDatabase.update("contactinfo", contentValues, "name=?", new String[]{name});
sqLiteDatabase.close();
return updateResult;
}
/**
* 查询的方法(查找电话)
* @param name
* @return
*/
public String alterDate(String name){
String phone = null;
SQLiteDatabase readableDatabase = mMyDBHelper.getReadableDatabase();
// 查询比较特别,涉及到 cursor
Cursor cursor = readableDatabase.query("contactinfo", new String[]{"phone"}, "name=?", new String[]{name}, null, null, null);
if(cursor.moveToNext()){
phone=cursor.getString(0);
}
cursor.close(); // 记得关闭 corsor
readableDatabase.close(); // 关闭数据库
return phone;
}
}
package amqr.com.dbanddao; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.EditText; import android.widget.Toast; import amqr.com.dbanddao.dao.ContactInjfoDao; public class MainActivity extends AppCompatActivity { private EditText mEtName; private EditText mEtPhone; private ContactInjfoDao mDao; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mDao=new ContactInjfoDao(MainActivity.this); mEtName= (EditText) findViewById(R.id.mEtName); mEtPhone= (EditText) findViewById(R.id.mEtPhone); } public void add(View view){ String name=mEtName.getText().toString().trim(); String phone=mEtPhone.getText().toString().trim(); if(TextUtils.isEmpty(name)||TextUtils.isEmpty(phone)){ Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show(); return; }else{ long addLong = mDao.addDate(name, phone); if(addLong==-1){ Toast.makeText(this,"添加失败",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this,"数据添加在第 "+addLong+" 行",Toast.LENGTH_SHORT).show(); } } } public void delete(View view){ String name=mEtName.getText().toString().trim(); if(TextUtils.isEmpty(name)){ Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show(); return; }else{ int deleteDate = mDao.deleteDate(name); if(deleteDate==-1){ Toast.makeText(this,"删除失败",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this,"成功删除 "+deleteDate+" 条数据",Toast.LENGTH_SHORT).show(); } } } public void update(View view){ String name=mEtName.getText().toString().trim(); String phone=mEtPhone.getText().toString().trim(); if(TextUtils.isEmpty(name)||TextUtils.isEmpty(phone)){ Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show(); return; }else{ int count=mDao.updateData(name, phone); if(count==-1){ Toast.makeText(this,"更新失败",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this,"数据更新了 "+count+" 行",Toast.LENGTH_SHORT).show(); } } } public void query(View view){ String name=mEtName.getText().toString().trim(); if(TextUtils.isEmpty(name)){ Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show(); return; }else{ String phoneResult = mDao.alterDate(name); Toast.makeText(this,"手机号码为: "+phoneResult,Toast.LENGTH_SHORT).show(); } } }作者:阿敏其人 链接:https://www.jianshu.com/p/b5ff80941fab 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
3.Activity中
package amqr.com.dbanddao; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.EditText; import android.widget.Toast; import amqr.com.dbanddao.dao.ContactInjfoDao; public class MainActivity extends AppCompatActivity { private EditText mEtName; private EditText mEtPhone; private ContactInjfoDao mDao; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mDao=new ContactInjfoDao(MainActivity.this); mEtName= (EditText) findViewById(R.id.mEtName); mEtPhone= (EditText) findViewById(R.id.mEtPhone); } public void add(View view){ String name=mEtName.getText().toString().trim(); String phone=mEtPhone.getText().toString().trim(); if(TextUtils.isEmpty(name)||TextUtils.isEmpty(phone)){ Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show(); return; }else{ long addLong = mDao.addDate(name, phone); if(addLong==-1){ Toast.makeText(this,"添加失败",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this,"数据添加在第 "+addLong+" 行",Toast.LENGTH_SHORT).show(); } } } public void delete(View view){ String name=mEtName.getText().toString().trim(); if(TextUtils.isEmpty(name)){ Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show(); return; }else{ int deleteDate = mDao.deleteDate(name); if(deleteDate==-1){ Toast.makeText(this,"删除失败",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this,"成功删除 "+deleteDate+" 条数据",Toast.LENGTH_SHORT).show(); } } } public void update(View view){ String name=mEtName.getText().toString().trim(); String phone=mEtPhone.getText().toString().trim(); if(TextUtils.isEmpty(name)||TextUtils.isEmpty(phone)){ Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show(); return; }else{ int count=mDao.updateData(name, phone); if(count==-1){ Toast.makeText(this,"更新失败",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this,"数据更新了 "+count+" 行",Toast.LENGTH_SHORT).show(); } } } public void query(View view){ String name=mEtName.getText().toString().trim(); if(TextUtils.isEmpty(name)){ Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show(); return; }else{ String phoneResult = mDao.alterDate(name); Toast.makeText(this,"手机号码为: "+phoneResult,Toast.LENGTH_SHORT).show(); } } }作者:阿敏其人 链接:https://www.jianshu.com/p/b5ff80941fab 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
package amqr.com.dbanddao; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.EditText; import android.widget.Toast; import amqr.com.dbanddao.dao.ContactInjfoDao; public class MainActivity extends AppCompatActivity { private EditText mEtName; private EditText mEtPhone; private ContactInjfoDao mDao; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mDao=new ContactInjfoDao(MainActivity.this); mEtName= (EditText) findViewById(R.id.mEtName); mEtPhone= (EditText) findViewById(R.id.mEtPhone); } public void add(View view){ String name=mEtName.getText().toString().trim(); String phone=mEtPhone.getText().toString().trim(); if(TextUtils.isEmpty(name)||TextUtils.isEmpty(phone)){ Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show(); return; }else{ long addLong = mDao.addDate(name, phone); if(addLong==-1){ Toast.makeText(this,"添加失败",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this,"数据添加在第 "+addLong+" 行",Toast.LENGTH_SHORT).show(); } } } public void delete(View view){ String name=mEtName.getText().toString().trim(); if(TextUtils.isEmpty(name)){ Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show(); return; }else{ int deleteDate = mDao.deleteDate(name); if(deleteDate==-1){ Toast.makeText(this,"删除失败",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this,"成功删除 "+deleteDate+" 条数据",Toast.LENGTH_SHORT).show(); } } } public void update(View view){ String name=mEtName.getText().toString().trim(); String phone=mEtPhone.getText().toString().trim(); if(TextUtils.isEmpty(name)||TextUtils.isEmpty(phone)){ Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show(); return; }else{ int count=mDao.updateData(name, phone); if(count==-1){ Toast.makeText(this,"更新失败",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this,"数据更新了 "+count+" 行",Toast.LENGTH_SHORT).show(); } } } public void query(View view){ String name=mEtName.getText().toString().trim(); if(TextUtils.isEmpty(name)){ Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show(); return; }else{ String phoneResult = mDao.alterDate(name); Toast.makeText(this,"手机号码为: "+phoneResult,Toast.LENGTH_SHORT).show(); } } }作者:阿敏其人 链接:https://www.jianshu.com/p/b5ff80941fab 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
package amqr.com.dbanddao;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import amqr.com.dbanddao.dao.ContactInjfoDao;
public class MainActivity extends AppCompatActivity {
private EditText mEtName;
private EditText mEtPhone;
private ContactInjfoDao mDao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDao=new ContactInjfoDao(MainActivity.this);
mEtName= (EditText) findViewById(R.id.mEtName);
mEtPhone= (EditText) findViewById(R.id.mEtPhone);
}
public void add(View view){
String name=mEtName.getText().toString().trim();
String phone=mEtPhone.getText().toString().trim();
if(TextUtils.isEmpty(name)||TextUtils.isEmpty(phone)){
Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show();
return;
}else{
long addLong = mDao.addDate(name, phone);
if(addLong==-1){
Toast.makeText(this,"添加失败",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this,"数据添加在第 "+addLong+" 行",Toast.LENGTH_SHORT).show();
}
}
}
public void delete(View view){
String name=mEtName.getText().toString().trim();
if(TextUtils.isEmpty(name)){
Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show();
return;
}else{
int deleteDate = mDao.deleteDate(name);
if(deleteDate==-1){
Toast.makeText(this,"删除失败",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this,"成功删除 "+deleteDate+" 条数据",Toast.LENGTH_SHORT).show();
}
}
}
public void update(View view){
String name=mEtName.getText().toString().trim();
String phone=mEtPhone.getText().toString().trim();
if(TextUtils.isEmpty(name)||TextUtils.isEmpty(phone)){
Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show();
return;
}else{
int count=mDao.updateData(name, phone);
if(count==-1){
Toast.makeText(this,"更新失败",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this,"数据更新了 "+count+" 行",Toast.LENGTH_SHORT).show();
}
}
}
public void query(View view){
String name=mEtName.getText().toString().trim();
if(TextUtils.isEmpty(name)){
Toast.makeText(this,"填写不完整",Toast.LENGTH_SHORT).show();
return;
}else{
String phoneResult = mDao.alterDate(name);
Toast.makeText(this,"手机号码为: "+phoneResult,Toast.LENGTH_SHORT).show();
}
}
}
google中数据库增删改查的方法
1、增,insert()
/**
* 添加一条记录
* @param name 联系人姓名
* @param phone 联系人电话
* @return 返回的是添加后在数据库的行号 -1代表添加失败
*/
public long add(String name, String phone){
SQLiteDatabase db = helper.getWritableDatabase();
//db.execSQL("insert into contactinfo (name,phone) values (?,?)", new Object[]{name,phone});
ContentValues values = new ContentValues();
values.put("name", name);
values.put("phone", phone);
//内部是组拼sql语句实现的.
long rowid = db.insert("contactinfo", null, values);
//记得释放数据库资源
db.close();
return rowid;
}
2、删 delete();
/**
* 根据姓名删除一条记录
* @param name 要删除的联系人的姓名
* @return 返回0代表的是没有删除任何的记录 返回整数int值代表删除了几条数据
*/
public int delete(String name){
//判断这个数据是否存在.
SQLiteDatabase db = helper.getWritableDatabase();
//db.execSQL("delete from contactinfo where name=?", new Object[]{name});
int rowcount = db.delete("contactinfo", "name=?", new String[]{name});
db.close();
//再从数据库里面查询一遍,看name是否还在
return rowcount;
}
3、改,update()
/**
* 修改联系人电话号码
* @param newphone 新的电话号码
* @param name 要修改的联系人姓名
* @return 0代表一行也没有更新成功, >0 整数代表的是更新了多少行记录
*/
public int update(String newphone , String name){
SQLiteDatabase db = helper.getWritableDatabase();
//db.execSQL("update contactinfo set phone =? where name=?", new Object[]{newphone,name});
ContentValues values = new ContentValues();
values.put("phone", newphone);
int rowcount = db.update("contactinfo", values, "name=?", new String[]{name});
db.close();
return rowcount;
}
4、查, query()
/**
* 查询联系人的电话号码
* @param name 要查询的联系人
* @return 电话号码
*/
public String getPhoneNumber(String name){
String phone = null;
SQLiteDatabase db = helper.getReadableDatabase();
//Cursor cursor = db.rawQuery("select phone from contactinfo where name=?", new String[]{name});
Cursor cursor = db.query("contactinfo", new String[]{"phone"}, "name=?", new String[]{name}, null, null, null);
if(cursor.moveToNext()){//如果光标可以移动到下一位,代表就是查询到了数据
phone = cursor.getString(0);
}
cursor.close();//关闭掉游标,释放资源
db.close();//关闭数据库,释放资源
return phone;
}
Android 数据库框架
ORMLit的使用
1、下载 ORMLite Jar
2、配置bean类
通过注解的方式把bean类和数据库联系在一起
@DatabaseTable(tableName = "person")
public class Person {
@DatabaseField(generatedId=true)
private int id;
@DatabaseField(columnName="name")
private String name;
@DatabaseField(columnName="age")
private int age;
@DatabaseField(columnName="address")
private String address;
/**
* @return the id
*/
public int getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(int id) {
this.id = id;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the age
*/
public int getAge() {
return age;
}
/**
* @param age the age to set
*/
public void setAge(int age) {
this.age = age;
}
/**
* @return the address
*/
public String getAddress() {
return address;
}
/**
* @param address the address to set
*/
public void setAddress(String address) {
this.address = address;
}
}
在这里我们创建了Bean类,并与数据库建立了联系,有两件事是我们需要做的1.需要在@DatabaseTable注解中填入表名
2.在@DatabaseField(columnName=”“)填入字段名,设置字段的属性等等
创建数据库
与Android中的数据库创建相似,使用OrmLite创建数据库需要我们创建一个SqlOpenHelper继承OrmLiteSqliteOpenHelper,在OrmLiteSqliteOpenHelper也有两个重要方法,分别是onCreate和onUpgrade,负责数据库创建以及升级时的操作
public class MySqlOpenHelper extends OrmLiteSqliteOpenHelper {
private Dao<Person, Integer> mPersonDao;
public MySqlOpenHelper(Context context) {
super(context, "test", null, 1);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase arg0, ConnectionSource arg1) {
// TODO Auto-generated method stub
try {
//创建数据表
TableUtils.createTableIfNotExists(arg1, Person.class);
} catch (java.sql.SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase arg0, ConnectionSource arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
}
public Dao<Person, Integer> getPersonDao() throws java.sql.SQLException {
if (mPersonDao == null) {
mPersonDao = getDao(Person.class);
}
return mPersonDao;
}
}
数据库操作
插入操作
这些方法使用起来都比较简单,我们只需将自己的Bean传入到下列方法中即可
- create:插入一条数据
- createIfNotExists:如果不存在则插入
- createOrUpdate:如果存在则更新
查询操作
OrmLite为我提供了一系列的查询操作,方法很多,而且很多都是只看方法名就可以知道的,这里就不逐一介绍了,在这里介绍一下如何使用QueryBuilder进行复杂查找。
- 首先调用personDao.queryBuilder();获得该Dao下的QueryBuilder对象,
- 接下来设置QueryBuilder的查询条件,
- 最后通过QueryBuilder的query方法获得List对象,
1.多字段条件查询:
QueryBuilder builder = dao.queryBuilder();
builder.where().eq("字段名1","条件1").and.eq(""字段名2","条件2");
builder.query();
2.查询并按顺序输出
QueryBuilder<Person, Integer> builder = dao.queryBuilder();
builder.orderBy("字段名", true);
builder.query();
orderBy的方法第一参数表示按那个字段进行排序,第二个参数表示是否为升序。
3.分页查询
QueryBuilder<Person, Integer> builder = dao.queryBuilder();
builder.offset(10);//表示查询的起始位置
builder.limit(10);//表示总共获取的对象数量
builder.query();
删除和更改操作
与查询操作类似,ORMLite同样为我们提供了一系列的方法,同时也提供了复杂删除,复杂更改的DeleteBuilder和UpdateBuilder,其用法与QueryBuilder相似,就不详细介绍了。
其他框架总结与应用 点击打开链接