目录
第一种:裸写数据库
第二种:调用方法
删除数据库
第三种:RUL调用表单的增删改查
以前的数据库和Oracle,SQLserver,Mysql这些都是算是重量级的数据库
oracle————1-2G
SQLserver————500M
MySql————50M
SQLite————15k
数据库的分类可以通过三类来分:
前三种都是我们之前学过的适合用来当云端(服务器)的数据库,最后一个是用来在手机,浏览器上面的
现在我们开始学习SQLite的数据库:
这种数据库和以前的不太一样,以前的数据库都是在控制台或者用sql语句来操作的,但是SQLite和前面的数据库都不一样
他是用构造方法来建库,用oncreate方法来建表的
第一步:先和创建一个DBHepler跟我们以前的BaseDao一样的意思
不管是哪中,DBHepler都是继承的SQLiteOpenHelper
package com.example.utils;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class BaseDao extends SQLiteOpenHelper{
每次实例化数据库的时候就必须传入这些值,然后创建数据库
public BaseDao(Context context, String name, CursorFactory factory, int version) {
super(context, name, factory, version);
System.out.println("建库成功!");
}
创建表的信息,是子啊创建数据库的同时一起创建的,如果语句有错则不会创建
主键的字符必须子在前面加上_
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table Users(id integer primary key,name text,age real,sex text,favorite text,pass text,tupain text)");
System.out.println("建表成功!");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
在Android里面,数据类型是后判断的,即使你设置的类型是不存在的,在执行的时候也不会报错,只会在最终插入数据的时候开决定他的数据类型
数据类型的分类:
第二步:创建一个avtivity设置四个绑定按钮,分别绑定四个按钮,测试用,不过我这里是直接插入了项目,并且已经封装过了,所以先看封装后的代码:
package com.example.utils;
import java.util.ArrayList;
import java.util.List;
import com.example.entity.Users;
import com.example.test.TestDBHeplerActivity;
import android.R.string;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
public class OperateDao {
//删除表
public static void deleteTable(Context context) {
//创建爱数据库
BaseDao dao = new BaseDao(context, "JIN.db", null, 1);
//获得数据库
SQLiteDatabase db = dao.getWritableDatabase();
//sql语句
db.execSQL("delete from Users");
//关闭数据库
db.close();
System.out.println("删除表单方法执行完毕!");
}
public static void addUsers(Context context,Users users) {
//创建爱数据库
BaseDao dao = new BaseDao(context, "JIN.db", null, 1);
//获得数据库
SQLiteDatabase db = dao.getWritableDatabase();
//sql语句
db.execSQL("insert into Users(id,name, age, tupain, sex, favorite, pass) values(?,?,?,?,?,?,?)",new Object[] {users.getId(),users.getName(),users.getAge(),users.getTupian(),users.getSex(),users.getFavorite(),users.getPass()});
//关闭数据库
db.close();
System.out.println("增加方法执行完毕!");
}
public static List findUsers(Context context) {
//用来存储方法的返回对象
List list = new ArrayList();
//创建爱数据库
BaseDao dao = new BaseDao(context, "JIN.db", null, 1);
//获得数据库
SQLiteDatabase db = dao.getReadableDatabase();
//sql语句,查询的语句返回的是一个游标,通过移动游标来不断读取游标里面的值
//------------------------------------------------------------------------------------
cursor.getCount(); 获取游标的总长度
cursor.getColumnCount(); 获得每行的数据列数
cursor.getColumnIndex("name"); 获取某个属性所在的列数
cursor.getInt(i); 获取某列的数据值,分int和string
cursor.getString(i); 获取某列的数据值,分int和string
cursor.moveToFirst(); 使游标移动到第一条数据
cursor.moveToLast(); 使游标移动到最后一条数据
cursor.moveToNext(); 使游标移动到下一条数据
cursor.moveToPosition(i); 使游标移动到指定的位置
cursor.close();关闭游标
//------------------------------------------------------------------------------------
Cursor cursor = db.rawQuery("select * from Users", null);
while(cursor.moveToNext()){
int id = cursor.getInt(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
String tupain = cursor.getString(cursor.getColumnIndex("tupain"));
String sex = cursor.getString(cursor.getColumnIndex("sex"));
String favorite = cursor.getString(cursor.getColumnIndex("favorite"));
String pass = cursor.getString(cursor.getColumnIndex("pass"));
Users us = new Users(id, name, age, tupain, sex, favorite, pass);
list.add(us);
}
cursor.close();
db.close();
System.out.println("删除方法执行完成");
return list;
}
public static void deleteUsers(Context context,Users users) {
BaseDao dao = new BaseDao(context, "JIN.db", null, 1);
SQLiteDatabase db = dao.getWritableDatabase();
//前面的是sql语句,后面是替换占位符的参数值
db.execSQL("delete from Users where id = ?",new Object[] {users.getId()});
db.close();
}
}
第三步就是最后一步,在需要的时候调用这些方法
//调用增加的方法
OperateDao.addUsers(TestActivity.this, users);
//调用查询的方法
List list = OperateDao.findUsers(v.getContext());
上面那种,什么封装都没做,直接调用的时候自己写的sql语句,接下来学习一种封装了sql语句,只需我们调用方法在传入参数
第一步:也是要创建一个记录常量的类——常量类
有关数据库表名和版本号我们都快可以直接写成一个常量类,然后用常量来个他们赋值,假如需要修改的时候,也只需修改常量类的配置
package com.bdqn.utils;
public class Const {
public static final String DB_NAME="JIN.db";
public static final int VERSION = 1;
}
第二步:我们就可以创建爱你DBHepler类了,和上面的那种还是有些不同的
package com.bdqn.utils;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class DBHelper extends SQLiteOpenHelper{
//这是删除数据库方法所需的参数
private String NAME;
public DBHelper(Context context) {
//在这里我们就用常来代替原有的参数
super(context, Const.DB_NAME, null, Const.VERSION);
//这是删除数据库方法所需的参数
this.NAME=Const.DB_NAME;
System.out.println("建库成功!");
}
@Override
public void onCreate(SQLiteDatabase db) {
//建表语句和以前的没什么大的区别
db.execSQL("create table Users(_id Integer primary key autoincrement,name text,age real,pass text)");
System.out.println("建表成功!");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
// 删除数据库
//这是删除数据库方法所需的方法
public boolean deleteDatabase(Context context) {
System.out.println("删除数据库!");
return context.deleteDatabase(NAME);
}
}
第三步:实体类
package com.bdqn.entity;
public class Users {
private int id;
private String name;
private String pass;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Users(int id, String name, String pass, int age) {
super();
this.id = id;
this.name = name;
this.pass = pass;
this.age = age;
}
public Users() {
super();
// TODO Auto-generated constructor stub
}
}
第四部绑定页面上的是个按钮,和按钮的绑定事件
这种调用是支持事物的,事物一共有三步
package com.bdqn.activity;
import com.bdqn.entity.Users;
import com.bdqn.testrul_iduf.R;
import com.bdqn.utils.DBHelper;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class TestDAO extends Activity{
private Button addButton;
private Button deleteButton;
private Button findButton;
private Button updateButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
super.setContentView(R.layout.test1);
addButton = (Button)this.findViewById(R.id.add);
deleteButton = (Button)this.findViewById(R.id.delete);
findButton = (Button)this.findViewById(R.id.find);
updateButton = (Button)this.findViewById(R.id.update);
//数据库创建
// dbHelper = new DBHelper(this);
//删除数据库
// dbHelper.deleteDatabase(this);
//绑定
addButton.setOnClickListener(new insertOnclicklistener());
findButton.setOnClickListener(new findOnclicklistener());
deleteButton.setOnClickListener(new deleteOnclicklistener());
updateButton.setOnClickListener(new updateOnclicklistener());
}
//增
class insertOnclicklistener implements OnClickListener{
@Override
public void onClick(View v) {
DBHelper dbHelper = new DBHelper(TestDAO.this);
SQLiteDatabase db = null;
try {
db=dbHelper.getWritableDatabase();
//事物开启
db.beginTransaction();
//键值对存数
ContentValues values = new ContentValues();
values.put("name", "jin");
values.put("age", 22);
values.put("pass", "123");
db.insert("Users", null, values);
//事物提交
db.setTransactionSuccessful();
} catch (Exception e) {
e.printStackTrace();
}finally {
//事物结束
db.endTransaction();//如果事物没有提交就结束,之前的事物回滚
}
db.close();
}
}
//查
class findOnclicklistener implements OnClickListener{
@Override
public void onClick(View v) {
DBHelper dbHelper = new DBHelper(TestDAO.this);
SQLiteDatabase db = dbHelper.getReadableDatabase();
/*db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy)*/
Cursor cursor =
db.query("Users", new String[] {"_id","name","age","pass"}, null, null, null, null, null);
while(cursor.moveToNext()) {
int id = cursor.getInt(cursor.getColumnIndex("_id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
String pass = cursor.getString(cursor.getColumnIndex("pass"));
System.out.println(id);
System.out.println(name);
System.out.println(age);
System.out.println(pass);
}
db.close();
}
}
//删
class deleteOnclicklistener implements OnClickListener{
@Override
public void onClick(View v) {
DBHelper dbHelper = new DBHelper(TestDAO.this);
SQLiteDatabase db = dbHelper.getWritableDatabase();
int count = db.delete("Users", "_id=?", new String[] {"1"});
System.out.println("删除了"+count+"行");
}
}
//改
class updateOnclicklistener implements OnClickListener{
@Override
public void onClick(View v) {
DBHelper dbHelper = new DBHelper(TestDAO.this);
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", "金前旺");
db.update("Users", values, "_id=?", new String[] {"1"});
}
}
}
在这里先记录一下删除数据库的方法
假如我们的数据表创建的不太满意,或者参数需要修改,我们完全可以删除数据库,再次创建
//package com.bdqn.utils;
//
//import android.content.Context;
//import android.database.sqlite.SQLiteDatabase;
//import android.database.sqlite.SQLiteDatabase.CursorFactory;
//import android.database.sqlite.SQLiteOpenHelper;
//
//public class DBHelper extends SQLiteOpenHelper{
// //这是删除数据库方法所需的参数
private String NAME;
//
// public DBHelper(Context context) {
// //在这里我们就用常来代替原有的参数
// super(context, Const.DB_NAME, null, Const.VERSION);
// //这是删除数据库方法所需的参数
this.NAME=Const.DB_NAME;
// System.out.println("建库成功!");
// }
//
// @Override
// public void onCreate(SQLiteDatabase db) {
// //建表语句和以前的没什么大的区别
// db.execSQL("create table Users(_id Integer primary key autoincrement,name text,age real,pass text)");
// System.out.println("建表成功!");
// }
//
// @Override
// public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//
// }
//
// // 删除数据库
// //这是删除数据库方法所需的方法
public boolean deleteDatabase(Context context) {
System.out.println("删除数据库!");
return context.deleteDatabase(NAME);
}
//
//
//
//}
上面的几句没有注释的就是,删除数据库的必要参数和方法,到时候直接用数据库对象调用这个方法就可以删除了
第一步
package com.bdqn.utils;
public class Const {
public static final String DB_NAME="JIN.db";
public static final int VERSION = 1;
}
第二步
package com.bdqn.utils;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class DBHelper extends SQLiteOpenHelper{
private String NAME;
public DBHelper(Context context) {
super(context, Const.DB_NAME, null, Const.VERSION);
// TODO Auto-generated constructor stub
this.NAME=Const.DB_NAME;
System.out.println("建库成功!");
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("create table Users(_id Integer primary key autoincrement,name text,age real,pass text)");
System.out.println("建表成功!");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
// 删除数据库
public boolean deleteDatabase(Context context) {
System.out.println("删除数据库!");
return context.deleteDatabase(NAME);
}
}
第三步:这一步就和之前的就不一样了,这里需要创建一个UsersDao并且继承ContentProvider
package com.bdqn.contentprovider;
import com.bdqn.utils.DBHelper;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
public class UsersDao extends ContentProvider{
private DBHelper dbhepler;
@Override
public boolean onCreate() {
//创建数据库
dbhepler = new DBHelper(super.getContext());
System.out.println("创建数据库");
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteDatabase db = dbhepler.getReadableDatabase();
Cursor cursor = db.query("Users", projection, selection, selectionArgs, null, null, null);
System.out.println("====="+cursor.getCount());
return cursor;
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO Auto-generated method stub
SQLiteDatabase db = dbhepler.getReadableDatabase();
db.insert("Users", null, values);
return null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
SQLiteDatabase db = dbhepler.getReadableDatabase();
int count = db.delete("Users", selection, selectionArgs);
return count;
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
SQLiteDatabase db = dbhepler.getReadableDatabase();
int count = db.update("Users", values, selection, selectionArgs);
return count;
}
}
第四步就不是调用了,我们需要在总配置文件进行一下配置,不然我们就没有办法得到url参数
第一种配置的方法就是在空制台添加
第二种赋值配置文件,然后修改
第一个参数是该类的全类名,第二个就是等下我们调用时解析用的路径
第五步:创建activity类绑定按钮和点击事件调试
package com.bdqn.activity;
import com.bdqn.entity.Users;
import com.bdqn.utils.DBHelper;
import com.example.testrul_iduf222222.R;
import android.R.string;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class TestDAO extends Activity{
private Button addButton;
private Button deleteButton;
private Button findButton;
private Button updateButton;
private Uri url;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
super.setContentView(R.layout.test1);
addButton = (Button)this.findViewById(R.id.add);
deleteButton = (Button)this.findViewById(R.id.delete);
findButton = (Button)this.findViewById(R.id.find);
updateButton = (Button)this.findViewById(R.id.update);
//解析地址
url = url.parse("content://com.bdqn.contentprovider");
//数据库创建
// dbHelper = new DBHelper(this);
//删除数据库
// dbHelper.deleteDatabase(this);
//绑定
addButton.setOnClickListener(new insertOnclicklistener());
findButton.setOnClickListener(new findOnclicklistener());
deleteButton.setOnClickListener(new deleteOnclicklistener());
updateButton.setOnClickListener(new updateOnclicklistener());
}
//增
class insertOnclicklistener implements OnClickListener{
@Override
public void onClick(View v) {
ContentValues values = new ContentValues();
values.put("name", "金前旺");
values.put("age", 999);
values.put("pass", "123");
//调用方式
TestDAO.this.getContentResolver().insert(url, values);
}
}
//查
class findOnclicklistener implements OnClickListener{
@Override
public void onClick(View v) {
Cursor cursor = TestDAO.this.getContentResolver().query(url, null,null,null,null);
System.out.println(cursor.getCount());
while(cursor.moveToNext()) {
int id = cursor.getInt(cursor.getColumnIndex("_id"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String pass = cursor.getString(cursor.getColumnIndex("pass"));
System.out.println(id);
System.out.println(name);
System.out.println(pass);
System.out.println(age);
}
}
}
//删
class deleteOnclicklistener implements OnClickListener{
@Override
public void onClick(View v) {
//调用方式
int count =
TestDAO.this.getContentResolver().delete(url, "_id=?", new String[] {"2"});
System.out.println("删除了"+count+"行");
}
}
//改
class updateOnclicklistener implements OnClickListener{
@Override
public void onClick(View v) {
ContentValues values = new ContentValues();
values.put("name", "斤斤计较军军");
TestDAO.this.getContentResolver().update(url, values, "_id=?", new String[] {"2"});
}
}
}
private Uri url;
//解析地址
url = url.parse("content://com.bdqn.contentprovider");