您的位置:首页 > 数据库

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

2016-03-30 20:49 477 查看
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命令查看帮助信息



执行.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



下面使用代码实现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创建数据库



实现步骤:

首先新建一个类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()方法了







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操作和事务









5.Sqlite游戏玩家管理案例





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: