数据存储之SQLite 数据库存储——第一行代码Android学习笔记

SQLite 是一款轻量级的关系型数据库, 它的运算速度非常快,占用资源很少。存储大量复杂的关系型数据的时候使用。

一、创建数据库
SQLiteOpenHelper 助类, 借助这个类就可以非常简单地对数据库进行创建和升级。 SQLiteOpenHelper 中有两个抽象方法,分别是onCreate()onUpgrade(),我们必须在自己的帮助类里面重写这两个方法,然后分别在这两个方法中去实现创建、升级数据库的逻辑。getReadableDatabase() getWritableDatabase()。 这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。数据库文件会存放在/data/data//databases/目录下。
新建一个 DatabaseTest 项目。新建 MyDatabaseHelper类继承自 SQLiteOpenHelper。

package com.example.databasetest;

import android.content.Context;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;

public class MyDatabaseHelper extends SQLiteOpenHelper {
	public static final String CREATE_BOOK="create table book ("
+ "id integer primary key autoincrement, "
+ "author text, "
+ "price real, "
+ "pages integer, "
+ "name text)";
	public static final String CREATE_CATEGORY = "create table Category ("
			+ "id integer primary key autoincrement, "
			+ "category_name text, "
			+ "category_code integer)";
	private	Context mContext;
	public MyDatabaseHelper(Context context, String name,
			CursorFactory factory, int version) {
		super(context, name, factory, version);
		// TODO Auto-generated constructor stub
		mContext=context;
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		db.execSQL(CREATE_BOOK);
		db.execSQL(CREATE_CATEGORY);
		Toast.makeText(mContext,"Create succeeded", Toast.LENGTH_SHORT).show();
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
		db.execSQL("drop table if exists Book");
		db.execSQL("drop table if exists Category");
		onCreate(db);
	}

}

我们把建表语句定义成了一个字符串常量,然后在 onCreate()方法中又调用SQLiteDatabase execSQL()方法去执行这条建表语句, 并弹出一个 Toast 提示创建成功,这样就可以保证在数据库创建完成的同时还能成功创建 Book 表。

MainActivity 中:

package com.example.databasetest;

import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;


public class MainActivity extends Activity {
	private	MyDatabaseHelper dbHelper;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        dbHelper= new MyDatabaseHelper(this, "BookStore.db", null, 2);
        Button createDatabase =(Button)findViewById(R.id.create_database);
        Button addData =(Button)findViewById(R.id.add_data);
        Button upDateData=(Button)findViewById(R.id.update_data);
        Button deleteButton = (Button) findViewById(R.id.delete_data);
        Button queryButton = (Button) findViewById(R.id.query_data);
        queryButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				SQLiteDatabase db = dbHelper.getWritableDatabase();
				Cursor cursor = db.query("Book", null, null, null, null, null, null);
				if (cursor.moveToFirst()) {
					do {
					// 遍历Cursor对象,取出数据并打印
					String name = cursor.getString(cursor.getColumnIndex("name"));
					String author = cursor.getString(cursor.getColumnIndex("author"));
					int pages = cursor.getInt(cursor.getColumnIndex("pages"));
					double price = cursor.getDouble(cursor.getColumnIndex("price"));
					Log.d("MainActivity", "book name is " + name);
					Log.d("MainActivity", "book author is " + author);
					Log.d("MainActivity", "book pages is " + pages);
					Log.d("MainActivity", "book price is " + price);
					} while (cursor.moveToNext());
					}
				cursor.close();
			}
		});
        deleteButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				SQLiteDatabase db=dbHelper.getWritableDatabase();
				db.delete("book", "pages > ?", new String[] { "500" });
			}
		});
        upDateData.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				SQLiteDatabase db = dbHelper.getWritableDatabase();
				ContentValues values = new ContentValues();
				values.put("price", 10.99);
				db.update("book", values, "name=?", new String[]{"The Da Vinci Code"});
			}
		});
        addData.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				SQLiteDatabase db = dbHelper.getWritableDatabase();//getWritableDatabase()返回SQLiteDatabase类型 支持CRUD
				ContentValues values = new ContentValues();
				// 开始组装第一条数据
				values.put("name", "The Da Vinci Code");
				values.put("author", "Dan Brown");
				values.put("pages", 454);
				values.put("price", 16.96);
				db.insert("book", null, values);
				values.clear();
				// 开始组装第二条数据
				values.put("name", "The Lost Symbol");
				values.put("author", "Dan Brown");
				values.put("pages", 510);
				values.put("price", 19.95);
				db.insert("book", null, values);
			}
		});
        createDatabase.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				dbHelper.getWritableDatabase();
			}
		});
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}
我们在 onCreate()方法中构建了一个 MyDatabaseHelper 对象, 并且通过构造函数的参数将数据库名指定为 BookStore.db,版本号指定为 1,然后在 Create database 按钮的点击事件里调用了 getWritableDatabase()方法。 这样当第一次点击 Create database 按钮时, 就会检测
到当前程序中并没有 BookStore.db 这个数据库, 于是会创建该数据库并调用 MyDatabaseHelper中的 onCreate()方法,这样 Book 表也就得到了创建,然后会弹出一个 Toast 提示创建成功。再次点击 Create database 按钮时,会发现此时已经存在 BookStore.db 数据库了,因此不会再创建一次。

二、 升级数据库
onUpgrade()方法是用于对数据库进行升级的。代码见上面。我们在 onUpgrade()方法中执行了两条 DROP 语句,如果发现数据库中已经存在 Book 表或 Category 表了,就将这两张表删除掉,然后再调用 onCreate()方法去重新创建。 SQLiteOpenHelper 的构造方法里将数据库版本号指定为 2,表示我们对数据库进行升级了。

三、添加数据

前面我们已经知道, 调用 SQLiteOpenHelper getReadableDatabase() getWritableDatabase()方法是可以用于创建和升级数据库的, 不仅如此, 这两个方法还都会返回一个 SQLiteDatabase对象,借助这个对象就可以对数据进行 CRUD 操作了。
代码见上面。在添加数据按钮的点击事件里面,我们先获取到了 SQLiteDatabase 对象,然后使用ContentValues 来对要添加的数据进行组装。接下来调用了 insert()方法将数据添加到表当中。

四、更新数据
update()方法用于对数据进行更新,这个方法接收四个参数, 第一个参数和 insert()方法一样, 也是表名, 在这里指定去更新哪张表里的数
据。第二个参数是 ContentValues 对象,要把更新数据在这里组装进去。第三、第四个参数用于去约束更新某一行或某几行中的数据,不指定的话默认就是更新所有行。

五、删除数据
SQLiteDatabase 中提供了一个 delete()方法专门用于删除数据, 这个方法接收三个参数, 第一个参数仍然是表名, 这个已经没什么好说的了, 第二、 第三个参数又是用于去约束删除某一行或某几行的数据,不指定的话默认就是删除所有行。
六、查询数据
SQLiteDatabase 中还提供了一个 query()方法用于对数据进行查询。需要传入七个参数。 第一个参数不用说, 当然还是表名, 表示我们希望从哪张表中查询数据。 第二个参数用于指定去查询哪几列, 如果不指定则默认查询所有列。 第三、 第四个参数用于去约束查询某一行或某几行的数据, 不指定则默认是查询所有行的数据。 第五个参数用于指定需要去 group by 的列, 不指定则表示不对查询结果进行 group by 操作。 第六个参数用于对 group by 之后的数据进行进一步的过滤, 不指定则表示不进行过滤。 第七个参数用于指定查询结果的排序方式, 不指定则表示使用默认的排序方式。


你可能感兴趣的:(Android应用开发)