zoukankan      html  css  js  c++  java
  • SQLite操作

    操作数据库需要通过SQLiteOpenHelper的getReadableDatabase()或getWritableDatabase()来获得可读和可读写的SQLiteDatabase。

    然后通过SQLiteDatabase的一系列方法来操作数据库。

    因为SQLiteOpenHelper是抽象类,需要自己写一个类来继承它。

    下面通过一个例子来说明如何操作数据库。


    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteDatabase.CursorFactory;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.util.Log;
    
    /**
     * SQLiteOpenHelper是一个抽象类,不能直接使用,需要自己写一个类继承它。
     * 然后可以通过getReadableDatabase()获取一个可读的database;<br>
     * 通过getWritableDatabase()方法获取一个可读写的Database。<br>
     * 如果只有查询操作,就用getReadableDatabase()就可以了。
     * @author lucky star
     *
     */
    public class DatabaseHelper extends SQLiteOpenHelper {
    	// 数据库版本号,从1开始,必须是大于0的整数。
    	public final static int VERSION = 1;
    	
    	// 需要复写SQLiteOpenHelper的这个构造方法。
    	public DatabaseHelper(Context context, String name, CursorFactory factory,
    			int version) {
    		super(context, name, factory, version);
    		// TODO Auto-generated constructor stub
    	}
    	
    	public DatabaseHelper(Context context,String name,int version) {
    		this(context,name,null,version);
    	}
    	
    	public DatabaseHelper(Context context,String name) {
    		this(context,name,null,VERSION);
    	}
    
    	@Override
    	public void onCreate(SQLiteDatabase db) {
    		Log.d("DatabaseHelper", "onCreate()");
    		// 创建数据时就创建好表结构。
    		db.execSQL("create table user(id int primary key,name varchar(32),age int)");
    		Log.d("DatabaseHelper","create table user.");
    	}
    
    	@Override
    	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    		Log.d("DatabaseHelper","onUpgrade()");
    	}
    
    }
    
    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.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.Toast;
    
    public class DatabaseOperationActivity extends Activity {
    	// 创建数据库
    	private Button createDatabaseBtn = null;
    	// 升级数据库
    	private Button upgradeDatabaseBtn = null;
    	private Button insertBtn = null;
    	private Button updateBtn = null;
    	private Button queryBtn = null;
    	private Button deleteBtn = null;
    	private DatabaseHelper dh = null;
    	private SQLiteDatabase sdb = null;
    	
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		// TODO Auto-generated method stub
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.database);
    
    		createDatabaseBtn = (Button) findViewById(R.id.database_creaet_btn);
    		insertBtn = (Button) findViewById(R.id.database_add_btn);
    		updateBtn = (Button) findViewById(R.id.database_update_btn);
    		queryBtn = (Button) findViewById(R.id.database_query_btn);
    		deleteBtn = (Button) findViewById(R.id.database_delete_btn);
    		upgradeDatabaseBtn = (Button) findViewById(R.id.database_upgrade_btn);
    		
    		createDatabaseBtn.setOnClickListener(new CreateDatabaseListener());
    		upgradeDatabaseBtn.setOnClickListener(new UpgradeDatabaseListener());
    		insertBtn.setOnClickListener(new InsertDataListener());
    		updateBtn.setOnClickListener(new UpdateDataListener());
    		queryBtn.setOnClickListener(new QueryDataListener());
    		deleteBtn.setOnClickListener(new DeleteDataListener());
    	}
    	
    	class CreateDatabaseListener implements OnClickListener {
    		@Override
    		public void onClick(View v) {
    			// 创建的数据库名是:lucky_star_db
    			dh = new DatabaseHelper(DatabaseOperationActivity.this, "lucky_star_db");
    			// 只执行上面一行代码是不会创建数据库的,需要调用它的getReadableDatabase()或getWritableDatabase()方法。
    			//dh.getReadableDatabase();
    			// 因为后面会用到增,删,改,查,必须调用getWritable()方法来得到SQLiteDatabase对象,因此声明一个成员变量
    			// 这里用dh.getWritableDatabase()初始化。
    			sdb = dh.getWritableDatabase();
    		}
    	}
    	
    	class UpgradeDatabaseListener implements OnClickListener {
    		@Override
    		public void onClick(View v) {
    			// 创建的数据库名是:lucky_star_db,创建的数据库版本号是1,这里升级数据库,版本号为2
    			dh = new DatabaseHelper(DatabaseOperationActivity.this, "lucky_star_db",2);
    			// 只执行上面一行代码是不会创建数据库的,需要调用它的getReadableDatabase()或getWritableDatabase()方法。
    			//dh.getReadableDatabase();
    			// 因为后面会用到增,删,改,查,必须调用getWritable()方法来得到SQLiteDatabase对象,因此声明一个成员变量
    			// 这里用dh.getWritableDatabase()初始化。
    			sdb = dh.getWritableDatabase();
    		}
    	}
    	
    	class InsertDataListener implements OnClickListener {
    		@Override
    		public void onClick(View v) {
    			ContentValues values = new ContentValues();
    			values.put("id", 1);
    			values.put("name", "诸葛亮");
    			values.put("age", 29);
    			sdb.insert("user", null, values);
    			Log.d(DatabaseOperationActivity.this.getClass().getName(), "insert data into db.");
    		}
    	}
    	
    	class UpdateDataListener implements OnClickListener {
    		@Override
    		public void onClick(View v) {
    			ContentValues values = new ContentValues();
    			values.put("id", 1);
    			values.put("name", "貂蝉");
    			values.put("age", 21);
    			sdb.update("user", values, "id=? and age=?", new String[]{"1","29"});
    			Log.d(DatabaseOperationActivity.this.getClass().getName(), "update data.");
    		}
    	}
    	
    	class QueryDataListener implements OnClickListener {
    		@Override
    		public void onClick(View v) {
    			ContentValues values = new ContentValues();
    			values.put("id", 1);
    			values.put("name", "貂蝉");
    			values.put("age", 21);
    			Cursor cursor = sdb.query("user", new String[]{"id","name","age"}, "id=?", new String[] {"1"}, null, null, null);
    			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 msg = "查询到数据:[id:" + id + ",name:" + name + ",age:" + age;
    				Log.d(DatabaseOperationActivity.this.getClass().getName(), msg);
    				Toast.makeText(DatabaseOperationActivity.this, msg, Toast.LENGTH_LONG).show();
    			}
    			Log.d(DatabaseOperationActivity.this.getClass().getName(), "query data.");
    		}
    	}
    	
    	class DeleteDataListener implements OnClickListener {
    		@Override
    		public void onClick(View v) {
    			sdb.delete("user", "id=?", new String[] {"1"});
    			Log.d(DatabaseOperationActivity.this.getClass().getName(), "delete data.");
    		}
    	}
    
    }
    


    布局文件database.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="vertical"
      android:layout_width="match_parent"
      android:layout_height="match_parent">
        <Button 
        	android:id="@+id/database_creaet_btn"
        	android:layout_width="fill_parent"
        	android:layout_height="wrap_content"
        	android:text="@string/createDatabase"
        />
        <Button 
        	android:id="@+id/database_upgrade_btn"
        	android:layout_width="fill_parent"
        	android:layout_height="wrap_content"
        	android:text="@string/upgradeDatabase"
        />
        <Button 
        	android:id="@+id/database_add_btn"
        	android:layout_width="fill_parent"
        	android:layout_height="wrap_content"
        	android:text="@string/addData"
        />
        <Button 
        	android:id="@+id/database_update_btn"
        	android:layout_width="fill_parent"
        	android:layout_height="wrap_content"
        	android:text="@string/updateData"
        />
        <Button 
        	android:id="@+id/database_query_btn"
        	android:layout_width="fill_parent"
        	android:layout_height="wrap_content"
        	android:text="@string/queryData"
        />
        <Button 
        	android:id="@+id/database_delete_btn"
        	android:layout_width="fill_parent"
        	android:layout_height="wrap_content"
        	android:text="@string/deleteData"
        />
    </LinearLayout>
    


    效果图:


    非常简单,6个按钮,一个按钮对应一种数据库操作。

    先看看创建数据库:

    单击“创建数据库”按钮,屏幕上没有任何提示,那我们怎么查看是否创建成功了呢?


    ps:因为我的环境变量没有配置,因此是直接进入adb所在目录执行的命令。

    可以看到,有一个data目录,进入里面。


    下面还有一个data目录,进入其中。


    标红的部分是我的应用程序的包名,进入其中


    进入databases


    OK,这个就是我们的数据库名了。上面的activity中,创建数据库时指定的名字就是这个。

    在终端中进入数据库,查看创建的数据库和表。




    下面看插入数据到数据库。

    单击“添加数据”按钮,

    然后查看是否增加成功。


    OK,增加数据成功,只不过是乱码。


    OK,再看查看数据,单击查看数据。



    可以看到查询数据OK了,保存的时候在数据库中保存的是乱码,查询出来时OK的。


    OK,修改数据,单击修改按钮。


    OK,修改数据成功。


    看看删除数据是否OK,单击“删除”按钮,


    OK,删除数据也是OK的。


    最后,看看升级数据库。

    单击“升级数据库”按钮。

    数据库版本发生变化时会调用SQLiteOpenHelper的onUpgrade()方法,在代码中我们输出一句话。

    单击“升级数据库”按钮后,控制台输出:

    04-07 13:52:28.538: DEBUG/DatabaseHelper(520): onUpgrade()

    在创建数据库时会调用onCreate()方法,控制台输出:

    04-07 13:44:09.292: DEBUG/DatabaseHelper(520): onCreate()


    其实,在上面的每一个操作都输出有日志,下面看看输出:

    04-07 13:44:09.292: DEBUG/DatabaseHelper(520): onCreate()--》创建数据库时调用
    04-07 13:44:09.302: DEBUG/DatabaseHelper(520): create table user.--》创建数据库时调用
    04-07 13:45:33.445: DEBUG/com.and.test.DatabaseOperationActivity(520): insert data into db.-->插入数据时
    04-07 13:47:55.182: DEBUG/com.and.test.DatabaseOperationActivity(520): 查询到数据:[id:1,name:诸葛亮,age:29-->查询数据时
    04-07 13:47:55.412: DEBUG/com.and.test.DatabaseOperationActivity(520): query data.
    04-07 13:49:19.495: DEBUG/com.and.test.DatabaseOperationActivity(520): update data.-->更新数据时
    04-07 13:50:30.862: DEBUG/com.and.test.DatabaseOperationActivity(520): delete data.
    04-07 13:52:28.538: DEBUG/DatabaseHelper(520): onUpgrade()-->数据库升级时。


    在终端中删除数据库可以用rm 数据库文件名。如本例中rm lucky_star_db



  • 相关阅读:
    JVM性能调优的6大步骤,及关键调优参数详解
    JVM内存调优原则及几种JVM内存调优方法
    关于大型网站技术演进的思考(十六)--网站静态化处理—前后端分离—下(8)
    关于大型网站技术演进的思考(十五)--网站静态化处理—前后端分离—中(7)
    关于大型网站技术演进的思考(十四)--网站静态化处理—前后端分离—上(6)
    关于大型网站技术演进的思考(十三)--网站静态化处理—CSI(5)
    关于大型网站技术演进的思考(十二)--网站静态化处理—缓存(4)
    关于大型网站技术演进的思考(十一)--网站静态化处理—动静分离策略(3)
    关于大型网站技术演进的思考(十)--网站静态化处理—动静整合方案(2)
    关于大型网站技术演进的思考(九)--网站静态化处理--总述(1)
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3007468.html
Copyright © 2011-2022 走看看