欢迎投稿

今日深度:

王立平--SQLite,SQLiteOpenHelper的简单应用,sqliteope

王立平--SQLite,SQLiteOpenHelper的简单应用,sqliteopenhelper


Android平台提供给我们一个数据库辅助类来创建或打开数据库,这个辅助类继承自SQLiteOpenHelper类,在该类的构造器中,调用Context中的方法创建并打开一个指定名称的数据库对象。继承和扩展SQLiteOpenHelper类主要做的工作就是重写以下两个 方法。

public class MySQLiteHelper extends SQLiteOpenHelper {
public MySQLiteHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}
//数据库首次创建时执行此方法,一般讲创建表等初始化工作放在此处
//execSQL创建表
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
//创建表
String sql="create table if not exists hero_info("+ "id integer primary key,"+ "name varchar,"+ "level integer)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub

}

MainActivity.java

package com.example.sqllite;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase; 
import android.graphics.Color;
import android.os.Bundle;
import android.widget.TextView; 
public class MainActivity extends Activity {
private TextView tv;
private MySQLiteHelper h;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }
    public void init(){
     tv=(TextView) findViewById(R.id.tv);
     h=new MySQLiteHelper(this, "my.db", null, 1);
    insertAndUpdateData(h);
    //查询数据
    String result = queryData(h);
    tv.setTextColor(Color.RED);
    tv.setTextSize(20.0f);
    tv.setText("名字\t等级\n"+result);
   
   
    }
    
 
private void insertAndUpdateData(MySQLiteHelper helper) {
// TODO Auto-generated method stub

// 调用getReadableDatabase 方法返回的并不总是只读数据库对象,
// 一般来说该方法和getWriteableDatabase 方法的返回情况相同,
// 只有在数据库仅开放只读权限或磁盘已满时才会返回一个只读的数据库对象。

    SQLiteDatabase db = helper.getWritableDatabase();
    //使用execSQL方法向表中插入数据
    db.execSQL("insert into hero_info(name,level) values('bb',0)");
    //使用insert方法向表中插入数据
    ContentValues values = new ContentValues();
    values.put("name", "xh");
    values.put("level", 5);
    //调用方法插入数据
    db.insert("hero_info", "id", values);
    //使用update方法更新表中的数据
    //清空ContentValues对象
    values.clear();
    values.put("name", "xh");
    values.put("level", 10);
    //更新xh的level 为10
    db.update("hero_info", values, "level = 5", null);
    //关闭SQLiteDatabase对象
    db.close();

}  
//从数据库中查询数据
public String queryData(MySQLiteHelper myHelper){
String result = "";
//获得数据库对象
SQLiteDatabase db = myHelper.getReadableDatabase();
//查询表中的数据
Cursor cursor = db.query("hero_info", null, null, null, null, null, "id asc");
//获取name列的索引
int nameIndex = cursor.getColumnIndex("name");
//获取level列的索引
int levelIndex = cursor.getColumnIndex("level");
for (cursor.moveToFirst();!(cursor.isAfterLast());cursor.moveToNext()) {
result = result + cursor.getString(nameIndex)+ "\t\t";
result = result + cursor.getInt(levelIndex)+"\n";
}
cursor.close();//关闭结果集
db.close();//关闭数据库对象
return result;
}
@Override
protected void onDestroy() {
SQLiteDatabase db = h.getWritableDatabase();//获取数据库对象
//删除hero_info表中所有的数据 传入1 表示删除所有行------>点击back按钮
db.delete("hero_info", "1", null);
super.onDestroy();
}



在Android开发中,为何要用SQLiteOpenHelper得到一个SQLiteDatabase数据库,然后对数据库进行操作

知道单例模式吗?他的设计思想就是用了单例模式,当你有多个地方使用数据库的时候只给你提供了一个连接,这样既防止了起冲突又提高了性能
 

怎使用SQLite

以下是我看到的Kevin关于其使用的心得,原文的大体的意思是:Android例子涵盖了一些Sqlite的基本用法,但它们并没有深入地给出合理的使用方法,更重要的是,不合理的使用方法。大多数例子和文档只是涉及最基本的数据库查询,或者教你如何创建一个ContentProvider。从来不提及的地方像: · 什么地方创建和保存SQLiteOpenHelper实例? · 可以有多少个实例? · 多线程同时访问数据库有没有什么要担心的?基本的内容是,你可以任意次数地连接Sqlite数据库,而且Android系统也支持你这样做。Sqlite拥有文件级别的锁,用来同步访问和防止错误。如果你只知道这些,那么,将会给你带来很大的痛苦。开源的一个好处是,你可以深入代码一探究竟。从代码和一些测试中,我了解到以下事实: · Sqlite拥有文件级别的锁。许多线程可以同时读,但只有一个可以写。锁阻止多个同时写入。 · Android在SQLiteDatabase中实现了一些java锁来确保动作是同步进行。 · 如果你用多个线程疯狂地访问数据库,你的数据库不会(或不应该)崩溃。没提到的是,如果你通过多个不同的真实连接同时写数据库,其中的某个会失败,它不会等到前一个完成后继续写入。简单地,不会写入你的改变,更糟糕的是,你也得不到一个异常,只是在LogCat中输出一些message,仅此而已。SQLiteOpenHelper类做了一些有趣的事。尽管它有方法可以获得一个只读的连接和可读写的连接,但实质上它们是同一个连接。假设没有文件写错误的话,只读的连接实质上就是一个可读写的连接。有趣吧。因此,如果你的app中使用一个helper的话,即便从多线程中使用,你也从未使用多个连接。同样,一个helper中只有一个SQLiteDatabase的实例,这个实例中实现了一些java锁。因此,当你正在执行数据库的操作时,其它db的操作都将锁定。即便是你使用多个线程来做这些事以便优化数据库的性能,坏消息,没有什么用。按照我的认识,SQLite工作的方式,基本上不可能会破坏你的数据库,除非代码里有bug或者有硬件问题。因此,我推荐这样使用:创建一个SQLiteOpenHelper静态对象。什么时候去close它呢?不需要。当app关闭,它会自动释放文件引用。但是,会不会有“close() was never explicitly called on database”异常呢?如果你注意的话,当连接挂在那里的时候,你没有得到那个异常。你只是在连接已经建立,而你又尝试打开另一个时才会有异常。因此,你只需要打开一次连接。像这样来使用:public class DatabaseHelper extends OrmLiteSqliteOpenHelper{ private static DatabaseHelper instance; public static synchronized DatabaseHelper getHelper(Context context) { if (instance == null) instance = new DatabaseHelper(context); return instance; }//Other stuff... } 就这些。。。
 

www.htsjk.Com true http://www.htsjk.com/shujukunews/3603.html NewsArticle 王立平--SQLite,SQLiteOpenHelper的简单应用,sqliteopenhelper Android平台提供给我们一个数据库辅助类来创建或打开数据库,这个辅助类继承自SQLiteOpenHelper类,在该类的构造器中,调用Context中的...
评论暂时关闭