扣丁学堂笔记第16天SQLite数据库

1.简介与命令操作

首先找到sqlite3所在路径,如adt bundle的sqlite3路径为:E:\BaiduYunDownload\adt-bundle-windows-x86_64-20140702\adt-bundle-windows-x86_64-20140702\sdk\platform-tools

然后执行sqlite3.exe test.db

可以执行.help命令查看帮助信息

扣丁学堂笔记第16天SQLite数据库_第1张图片

执行.databases查看数据库所在位置

执行.tables查看创建的表;.schema pet查看表中创建的语句

执行select * from pet查询表中的数据

执行insert into pet (name,age) values ('doge',5);为数据表插入数据

这时候再执行select * from pet;语句就有数据了


除了使用命令行方式对数据库进行操作,还可以使用第三方可视化工具,如sqlite studio,官网为:http://sqlitestudio.pl/


2.元数据定义与SqliteOpenHelper

扣丁学堂笔记第16天SQLite数据库_第2张图片

下面使用代码实现sqlite数据库元数据的定义

实现步骤:

首先创建一个类PetMetaData,因为此类不可被继承,所以声明类时添加final关键字,此类不想被实例化,所以在构造方法时添加private关键字;

然后创建一张数据表,并且实现基类:public static abstract class DogTable implement BaseColumns{}

添加表名:public static final String TABLE_NAME = “dog”;

添加字段,如:name,age:public static final String NAME = "name";  public static final String AGE = "age";


使用SqliteOpenHelper创建数据库

扣丁学堂笔记第16天SQLite数据库_第3张图片

实现步骤:

首先新建一个类DatabaseHelper继承自SqliteOpenHelper,然后实现它的onCreate和onUpgrade方法;

还需要实现构造方法DatabaseHelper,传入四个参数:第一个是上下文context,第二个是数据库名称,第三个是游标,一般写null表明使用系统默认的,第四个是版本号;

在此之前可以先声明数据库的名称和版本号:private static final String DB_NAME = "pet.db"; private static final int VERSION = 1;此时可以只保留上下文一个参数,删掉其他三个,在super方法里传入四个变量

然后定义一个创建数据表一个删除数据表的常量;

现在就可以在onCreate和onUpgrade方法里调用db.execSQL()方法了

扣丁学堂笔记第16天SQLite数据库_第4张图片

扣丁学堂笔记第16天SQLite数据库_第5张图片扣丁学堂笔记第16天SQLite数据库_第6张图片

PetMetaData.java

package com.example.sqlitetest;

import android.provider.BaseColumns;

public final class PetMetaData {
	
	private PetMetaData(){}
	public static abstract class DogTable implements BaseColumns{
		public static final String TABLE_NAME = "dog";
		public static final String NAME = "name";
		public static final String AGE = "age";
	}
}


DatabaseHelper.java

package com.example.sqlitetest;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHelper extends SQLiteOpenHelper {

	private static final String DATABASE_NAME = "pet.db";
	private static final int VERSION = 1;

	private static final String CREATE_TABLE_DOG = "CREATE TABLE dog(_id INTEGER PRIMARY KEY AUTOINCREMENT,"
			+ "name TEXT,age INTEGER";
	private static final String DROP_TABLE_DOG = "DROP TABLE IF EXISTS dog";

	public DatabaseHelper(Context context) {
		super(context, DATABASE_NAME, null, VERSION);
	}

	// 如果数据库表不存在,会执行该方法
	@Override
	public void onCreate(SQLiteDatabase db) {
		// SQLiteDatabase 用于操作数据库的工具表
		db.execSQL(CREATE_TABLE_DOG);
	}

	// 升级
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		db.execSQL(DROP_TABLE_DOG);
		db.execSQL(CREATE_TABLE_DOG);

	}

}


3.增删改查操作

首先新建一个DatabaseAdapter类,

然后再新建一个实体类Dog,添加id,name,age等属性,生成三个构造方法;然后生成get,set方法;再生成toString方法;

……

(注:以下代码有误,然而悲催笔者无力排除BUG T^T)

DatabaseAdapter.java

package com.example.sqlitetest;

import java.util.ArrayList;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class DatabaseAdapter {

	private DatabaseHelper databaseHelper;

	public DatabaseAdapter(Context context) {
		databaseHelper = new DatabaseHelper(context);
	}

	//添加操作
	public void add(Dog dog) {

		// 获取操作数据库的工具类
		SQLiteDatabase db = databaseHelper.getWritableDatabase();
		ContentValues values = new ContentValues();
		values.put(PetMetaData.DogTable.NAME, dog.getName());
		values.put(PetMetaData.DogTable.AGE, dog.getAge());
		// 参数(表名,可以为null的列名,ContentValues)
		db.insert(PetMetaData.DogTable.TABLE_NAME, null, values);
		db.close();
	}

	// 删除操作
	public void delete(int id) {

		SQLiteDatabase db = databaseHelper.getWritableDatabase();
		String whereClause = PetMetaData.DogTable._ID + "=?";
		String[] whereArgs = { String.valueOf(id) };
		// 参数(表名,删除条件,删除条件的值)
		db.delete(PetMetaData.DogTable.TABLE_NAME, whereClause, whereArgs);
		db.close();
	}

	// 更新操作
	public void update(Dog dog) {

		SQLiteDatabase db = databaseHelper.getWritableDatabase();
		ContentValues values = new ContentValues();
		values.put(PetMetaData.DogTable.NAME, dog.getName());
		values.put(PetMetaData.DogTable.AGE, dog.getAge());
		String whereClause = PetMetaData.DogTable._ID + "=?";
		String[] whereArgs = { String.valueOf(dog.getId()) };
		// 参数(表名,ContentValues,条件,条件的值)
		db.update(PetMetaData.DogTable.TABLE_NAME, values, whereClause,
				whereArgs);
		db.close();
	}

	//根据ID查询单个记录
	public Dog findById(int id) {
		SQLiteDatabase db = databaseHelper.getReadableDatabase();
		String[] columns = { PetMetaData.DogTable._ID,
				PetMetaData.DogTable.NAME, PetMetaData.DogTable.AGE };
		// 参数(是否去除重复记录,表名,要查询的列,查询条件,查询条件的值,分组条件,分组条件的值,排序,分页条件)
		Cursor c = db.query(true, PetMetaData.DogTable.TABLE_NAME, columns,
				PetMetaData.DogTable._ID + "=?",
				new String[] { String.valueOf(id) }, null, null, null, null);

		Dog dog = null;
		if (c.moveToNext()) {
			dog = new Dog();
			dog.setId(c.getInt(c
					.getColumnIndexOrThrow(PetMetaData.DogTable._ID)));
			dog.setName(c.getString(c
					.getColumnIndexOrThrow(PetMetaData.DogTable.NAME)));
			dog.setAge(c.getInt(c
					.getColumnIndexOrThrow(PetMetaData.DogTable.AGE)));
			c.close();
			db.close();
		}
		return dog;
	}

	// 查询所有
	public ArrayList<Dog> findAll() {

		SQLiteDatabase db = databaseHelper.getReadableDatabase();
		String[] columns = { PetMetaData.DogTable._ID,
				PetMetaData.DogTable.NAME, PetMetaData.DogTable.AGE };
		// 参数(是否去除重复记录,表名,要查询的列,查询条件,查询条件的值,分组条件,分组条件的值,排序,分页条件)
		Cursor c = db.query(true, PetMetaData.DogTable.TABLE_NAME, columns,
				null, null, null, null, null, null);

		ArrayList<Dog> dogs = new ArrayList<Dog>();
		Dog dog = null;
		while (c.moveToNext()) {
			dog = new Dog();
			dog.setId(c.getInt(c
					.getColumnIndexOrThrow(PetMetaData.DogTable._ID)));
			dog.setName(c.getString(c
					.getColumnIndexOrThrow(PetMetaData.DogTable.NAME)));
			dog.setAge(c.getInt(c
					.getColumnIndexOrThrow(PetMetaData.DogTable.AGE)));
			dogs.add(dog);
			c.close();
			db.close();
		}
		return dogs;
	}
}


Dog.java

package com.example.sqlitetest;

public class Dog {

	private int id;
	private String name;
	private int age;
	public Dog() {
		super();
	}
	public Dog(int id, String name, int age) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
	}
	public Dog(String name, int age) {
		super();
		this.name = name;
		this.age = 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 int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Dog [id=" + id + ", name=" + name + ", age=" + age + "]";
	}
	
}

DatabaseHelper.java与PetMetaData.java见上文

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.sqlitetest.MainActivity" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:text="添加数据" 
        android:onClick="addClick"/>

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignRight="@+id/button2"
        android:layout_below="@+id/button2"
        android:text="删除数据" 
        android:onClick="deleteClick"/>

    <Button
        android:id="@+id/button4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/button3"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/button3"
        android:text="修改数据"
        android:onClick="updateClick" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignRight="@+id/button1"
        android:layout_below="@+id/button1"
        android:text="查询单个数据" 
        android:onClick="findByIdClick"/>

    <Button
        android:id="@+id/button5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/button4"
        android:layout_alignRight="@+id/button4"
        android:layout_below="@+id/button4"
        android:text="查询所有数据" 
        android:onClick="findAllClick"/>

</RelativeLayout>


MainActivity.java

package com.example.sqlitetest;

import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

	private DatabaseAdapter adapter;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		adapter = new DatabaseAdapter(this);
	}

	public void addClick(View view) {

		Dog dog = new Dog("doge",5);
		adapter.add(dog);
	}

	public void deleteClick(View view) {

		adapter.delete(1);
	}

	public void updateClick(View view) {

		Dog dog = new Dog(1,"wangwang",4);
		adapter.update(dog);
	}

	public void findByIdClick(View view) {

		Dog dog = adapter.findById(1);
		System.out.println(dog);
	}

	public void findAllClick(View view) {

		ArrayList<Dog> dogs = adapter.findAll();
		int size = dogs.size();
		for(int i=0;i<size;i++){
			System.out.println(dogs.get(i));
		}
	}
}


4.原生sql操作和事务

扣丁学堂笔记第16天SQLite数据库_第7张图片


扣丁学堂笔记第16天SQLite数据库_第8张图片扣丁学堂笔记第16天SQLite数据库_第9张图片


5.Sqlite游戏玩家管理案例

扣丁学堂笔记第16天SQLite数据库_第10张图片扣丁学堂笔记第16天SQLite数据库_第11张图片

扣丁学堂笔记第16天SQLite数据库_第12张图片

你可能感兴趣的:(扣丁学堂笔记第16天SQLite数据库)