SQLite手机数据库

目录

第一种:裸写数据库

第二种:调用方法

删除数据库

第三种:RUL调用表单的增删改查


以前的数据库和Oracle,SQLserver,Mysql这些都是算是重量级的数据库

oracle————1-2G

SQLserver————500M

MySql————50M

SQLite————15k

数据库的分类可以通过三类来分:

  1. 运行环境(云端,终端)
  2. 运行大小
  3. 设计语言(嵌入式)

前三种都是我们之前学过的适合用来当云端(服务器)的数据库,最后一个是用来在手机,浏览器上面的

现在我们开始学习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里面,数据类型是后判断的,即使你设置的类型是不存在的,在执行的时候也不会报错,只会在最终插入数据的时候开决定他的数据类型

数据类型的分类:

  1. 强类型:java的string,double,float。。。。
  2. 弱类型:js的var,let

第二步:创建一个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<Users> findUsers(Context context) {
		//用来存储方法的返回对象
		List<Users> list = new ArrayList<Users>();
		//创建爱数据库
		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<Users> 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
	}
}

第四部绑定页面上的是个按钮,和按钮的绑定事件

这种调用是支持事物的,事物一共有三步

  1. db.beginTransaction(); //开启事务
  2. db.setTransactionSuccessful();//提交事务
  3. db.endTransaction();//如果事物没有提交就结束,之前的事物回滚
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);
	}
//
//
//
//}

上面的几句没有注释的就是,删除数据库的必要参数和方法,到时候直接用数据库对象调用这个方法就可以删除了

第三种:RUL调用表单的增删改查

第一步

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参数

第一种配置的方法就是在空制台添加

第二种赋值配置文件,然后修改

<provider android:name="com.bdqn.contentprovider.UsersDao" 
            android:authorities="com.bdqn.contentprovider"
            android:exported="true"></provider>

第一个参数是该类的全类名,第二个就是等下我们调用时解析用的路径

第五步:创建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");

猜你喜欢

转载自blog.csdn.net/jinqianwang/article/details/82660837