android如何操作SQLite数据库

时间: 2015-06-21 00:14 栏目: Android 浏览: 2015 赞: 1 踩: 0 字体:

以下为本篇文章全部内容:

在Android开发的时候我们避免不了需要使用到本地缓存,本地缓存有很多中方式,文件也可以当本地存储,但是为了更好的管理其他存储,我们可以使用SQLite,只要你懂SQL语句就能轻易的操作SQLite数据库了,语法跟MySQL基本无差异。当我们在做文章列表存储的时候SQLite的优势就很容易被体现出来,我们把文章的图片下载到本地,然后把文章的标题、内容、图片路径等信息存放到SQLite数据即可,在我们没有网的情况下就可以通过读取SQLite数据库的内容来展示了。因为报错在了手机自身里面的数据库里面,无需我们从网络获取,往后我还会再出一篇文章关于做本地存储的教程,今天仅仅讲如何简单的操作增删改查的,我将使用ListView+SQLite的结合来演示这个增删改查的操作。效果如下图:

ListView+SQList.gif

按照老规矩出牌,先看看我们操作SQLite常用的方法和参数是什么意思

/*

 *从 SQLiteOpenHelper继承的常用方法

 *void SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version);SQLiteOpenHelper的构造方法,继承的时候使用super调用

 * 参数1:上下文环境

 * 参数2:数据库名称

 * 参数3:工厂游标(可为null)

 * 参数4:数据库版本号

 *void onCreate(SQLiteDatabase db);当数据库创建的时候调用

 * 参数1:SQLiteDatabase数据库对象

 *void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion);当数据库版本号有更新的时候调用

 * 参数1:SQLiteDatabase数据库对象

 * 参数2:数据库老版本号

 * 参数3:数据库新版本号

 *SQLiteDatabase getReadableDatabase();获取一个可读SQLiteDatabase数据库对象

 *SQLiteDatabase getWritableDatabase();获取一个可写SQLiteDatabase数据库对象

 *从SQLiteDatabase继承的常用方法

 *long insert(String table, String nullColumnHack, ContentValues values);向数据库写入数据

 * 参数1:表名

 * 参数2:可为空

 * 参数3:ContentValues对象

 *int delete(String table, String whereClause, String[] whereArgs);从数据库删除一条数据

 * 参数1:表名

 * 参数2:删除条件

 * 参数3:条件参数值

 *int update(String table, ContentValues values, String whereClause, String[] whereArgs);更新数据库数据

 * 参数1:表名

 * 参数2:ContentValues对象

 * 参数3:更新条件

 * 参数4:条件参数值

 *void execSQL(String sql);执行一条sql语句

 * 参数1:sql语句

 *void execSQL(String sql, Object[] bindArgs);执行一条sql语句

 * 参数1:sql语句

 * 参数2:sql语句的参数值

 *ContentValues向数据库操作值的对象

 * void put(String key, String value);往ContentValues添加一对键值对

 * void remove(String key);从ContentValues移除一对键值对

 * void clear();清空ContentValues

 *Cursor存储从数据库获取出来的值(常用方法)

 *boolean moveToFirst();把指针移动到第一位

 *boolean moveToNext();把指针向后移动一位

 *boolean moveToLast();把指针移动到最后一位

 *int getCount();返回Cursor总行数

 *int getColumnIndex(String columnName);通过字段名称获取当前下标

 *String getString(int columnIndex);通过下标获取值,可以和getColumnIndex配合使用,其他类型类似该方法

 *void close();关闭释放资源

 */

根据以上属性我们需要写一个SQLite的工具类,该类需要继承SQLiteOpenHelper,然后通过这个工具类来创建我们的数据库

SQLiteTool.java

package com.sunnyos.listviewsqlite;

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

public class SQLiteTool extends SQLiteOpenHelper{
        
	public SQLiteTool(Context context,String name) {
	    /**
            * 构造方法根据传递过来的数据创建数据库,这个方法在属性上面有说过
            * 参数1:上下文
            * 参数2:数据库的名称
            * 参数3:工厂游标(可为null)
            * 参数4:数据库版本,如果这个版本号有变则会调用onUpgrade方法而不是调用onCreate
            */
	    super(context, name, null,1);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
	    //创建一个数据库    
	    db.execSQL("create table user(_id integer primary key autoincrement,name varchar(20),age int(10))");
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
	    // 这个方法是用来更新数据库版本的时候用的,例如我们在app版本从1升级到2之后,数据库的表结构有改变的话可以通过这个方法来进行更新数据库结构
	}
}

MainActivity.java

package com.sunnyos.listviewsqlite;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;


public class MainActivity extends Activity {
	private EditText name,age,id;
	private Button add,update,delete,select;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();//调用获取界面控件方法
        //添加操作
        add.setOnClickListener(new OnClickListener() {
	    @Override
	    public void onClick(View v) {
            //获取TextView里面的内容
	    String userName = name.getText().toString();
	    String userAge = age.getText().toString();
	    //调用SQLiteTool工具类进行数据操作
	    SQLiteDatabase db = new SQLiteTool(MainActivity.this, "sunny.db").getWritableDatabase();
	    //创建数据存储对象
	    ContentValues values = new ContentValues();
	    //往数据存储对象添加需要写入到数据的数据
	    values.put("name", userName);
	    values.put("age", userAge);
	    //执行写入数据库方法
	    long insert = db.insert("user", null, values);
	    //判断是否写入成功
	    if(insert>0){
                Toast.makeText(MainActivity.this, "添加成功", Toast.LENGTH_SHORT).show();
	    }else{
		Toast.makeText(MainActivity.this, "添加失败", Toast.LENGTH_SHORT).show();
	    }
	    //关闭数据库连接释放资源
            db.close();
	}
    });
    //更新操作
    update.setOnClickListener(new OnClickListener() {
        @Override
	public void onClick(View v) {
	    //获取TextView里面的内容
	    String userName = name.getText().toString();
	    String userAge = age.getText().toString();
	    String userId = id.getText().toString();
	    //调用SQLiteTool工具类进行数据操作
	    SQLiteDatabase db = new SQLiteTool(MainActivity.this, "sunny.db").getWritableDatabase();
	    //创建数据存储对象
	    ContentValues values = new ContentValues();
	    //往数据存储对象添加需要写入到数据的数据
	    values.put("name", userName);
	    values.put("age", userAge);
	    //执行数据更新方法
	    int update = db.update("user", values, "_id=?",new String[] {userId});
	    if(update>0){
	        Toast.makeText(MainActivity.this, "更新成功", Toast.LENGTH_SHORT).show();
	    }else{
		Toast.makeText(MainActivity.this, "更新失败", Toast.LENGTH_SHORT).show();
	    }
	    //关闭数据库连接释放资源
	    db.close();
	}
    });
        
    //删除操作
    delete.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
	    //获取需要删除的id
	    String userId = id.getText().toString();
	    //调用SQLiteTool工具类进行数据操作
	    SQLiteDatabase db = new SQLiteTool(MainActivity.this, "sunny.db").getWritableDatabase();
	    //执行删除方法
	    int delete = db.delete("user", "_id=?",new String[] {userId});
	    //判断删除是否成功
	    if(delete>0){
		Toast.makeText(MainActivity.this, "删除成功", Toast.LENGTH_SHORT).show();
	    }else{
	        Toast.makeText(MainActivity.this, "删除失败", Toast.LENGTH_SHORT).show();
	    }
	    //关闭数据库连接释放资源
	    db.close();
	}
    });
        
    select.setOnClickListener(new OnClickListener() {
	@Override
	public void onClick(View v) {
	    //调用SQLiteTool工具类进行数据操作
	    SQLiteDatabase db = new SQLiteTool(MainActivity.this, "sunny.db").getReadableDatabase();
	    //从数据库获取数据出来
	    Cursor c = db.rawQuery("select * from user order by _id desc",new String[] {});
	    List<Map<String, String>> list = new ArrayList<Map<String,String>>();
	    if(c!=null){
		while(c.moveToNext()){
		    Map<String, String> userMap = new HashMap<String, String>();
		    userMap.put("id", c.getString(c.getColumnIndex("_id")));
		    userMap.put("name", c.getString(c.getColumnIndex("name")));
		    userMap.put("age", c.getString(c.getColumnIndex("age")));
		    list.add(userMap);
	        }
	    }
	    //实例化SimpleAdapter对象
	    /*
	     * 参数1:上下文Context
	     * 参数2:存放数据的list数组,里面是map对象
	     * 参数3:需要遍历的list模版也就是list的xml文件
	     * 参数4:list里面map的key值
	     * 参数5:list模版xml文件对应的id
	     */
	    SimpleAdapter adapter = new SimpleAdapter(MainActivity.this, list, R.layout.list, 
		new String[] {"id","name","age"}, 
		new int[]{R.id.id,R.id.name,R.id.age});
		//通过listview把数据库获取出来的数据进行遍历
		ListView lv = (ListView) findViewById(R.id.lv);
		lv.setAdapter(adapter);
		c.close();
		//关闭数据库连接释放资源
		db.close();
	    }
        });
    }
    //获取界面控件
    public void init(){
    	name = (EditText) findViewById(R.id.name);
    	age = (EditText) findViewById(R.id.age);
    	id = (EditText) findViewById(R.id.id);
    	add = (Button) findViewById(R.id.add);
    	update = (Button) findViewById(R.id.update);
    	delete = (Button) findViewById(R.id.delete);
    	select = (Button) findViewById(R.id.select);
    }
}

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <EditText
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="姓名" />

        <EditText
            android:id="@+id/age"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="年龄" />

        <Button
            android:id="@+id/add"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="添加" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >
        
        <EditText 
            android:id="@+id/id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="修改或删除id"
            />
        
        <Button 
            android:id="@+id/delete"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="删除"
            />
        
        <Button 
            android:id="@+id/update"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="更新"
            />
        <Button 
            android:id="@+id/select"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="查询"
            />
    </LinearLayout>

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

list.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:padding="10dp"
     >
     
    <TextView 
	    android:id="@+id/id"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:layout_weight="1"
	    android:text="id"
	    />
    
	<TextView 
	    android:id="@+id/name"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:layout_weight="1"
	    android:text="name"
	    />
	
	<TextView 
	    android:id="@+id/age"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:layout_weight="1"
	    android:text="age"
	    />
</LinearLayout>

大家看完博文之后希望用理解的角度去看,不要直接复制代码过去直接就用了,不然过后就不知道怎么操作的了,重在理解,以后再遇到这种操作的时候就什么问题都不怕了。

谢谢大家对本博客的支持,本站专注原创技术文章,三更半夜做实验写文章不易,且看且珍惜博主的心得。请转载带上本文链接注明出处。

扫二维码快速加群:

qun.png

如果大家有什么疑问可以加我QQ327388905进行解答,也可以加入交流群ThinkPHP交流群