Android中SQLite应用详解

本文详细介绍如何使用SQLite进行数据库操作,包括创建、查询、更新、删除等核心方法,并提供了完整的示例代码,帮助开发者快速掌握SQLite的基本用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先介绍一些Cursor对象的常用方法:

c.move(int offset); //以当前位置为参考,移动到指定行  
c.moveToFirst();    //移动到第一行  
c.moveToLast();     //移动到最后一行  
c.moveToPosition(int position); //移动到指定行  
c.moveToPrevious(); //移动到前一行  
c.moveToNext();     //移动到下一行  
c.isFirst();        //是否指向第一条  
c.isLast();     //是否指向最后一条  
c.isBeforeFirst();  //是否指向第一条之前  
c.isAfterLast();    //是否指向最后一条之后  
c.isNull(int columnIndex);  //指定列是否为空(列基数为0)  
c.isClosed();       //游标是否已关闭  
c.getCount();       //总数据项数  
c.getPosition();    //返回当前游标所指向的行数  
c.getColumnIndex(String columnName);//返回某列名对应的列索引值  
c.getString(int columnIndex);   //返回当前行指定列的值

在onCreate方法中添加、更新和删除方法如下:

SQLiteDatabase db=openOnCreateDatebase("test.db",Context.MODE_PRIVATE,null);   //打开或创建text.db数据库
db.execSQL("DROP TABLE IF EXISTS person");  //创建person表
db.execSQL("CREATE TABLE person (_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age SMALLINT)");  
Person person = new Person();  
person.name = "john";  
person.age = 30;  
db.execSQL("INSERT INTO person VALUES (NULL, ?, ?)", new Object[]{person.name, person.age});  //SQL方式插入数据          
person.name = "david";  
person.age = 33;   
ContentValues cv = new ContentValues();  //ContentValues以键值对的形式存放数据 
cv.put("name", person.name);  
cv.put("age", person.age);  
db.insert("person", null, cv);  //插入ContentValues中的数据   
cv = new ContentValues();  
cv.put("age", 35);  
db.update("person", cv, "name = ?", new String[]{"john"});  //更新数据          
Cursor c = db.rawQuery("SELECT * FROM person WHERE age >= ?", new String[]{"33"});  
while (c.moveToNext()) {  
    int _id = c.getInt(c.getColumnIndex("_id"));  
    String name = c.getString(c.getColumnIndex("name"));  
    int age = c.getInt(c.getColumnIndex("age"));  
    Log.i("db", "_id=>" + _id + ", name=>" + name + ", age=>" + age);  
}  
c.close();      
db.delete("person", "age < ?", new String[]{"35"});  //删除数据          
db.close();  //关闭当前数据库, 否则容易报异常SQLiteException,或者使用deleteDatabase("test.db")删除test.db数据库  

SQL自己的添加、更新和删除方法如下:

db.insert(String table, String nullColumnHack, ContentValues values键值对);  
db.update(String table, Contentvalues values, String whereClause, String whereArgs);  
db.delete(String table, String whereClause, String whereArgs);  

实际开发中,会封装继承自SQLiteOpenHelper类的数据库操作类,然后以这个类为基础,再封装我们的业务逻辑方法
1、新建DBHelper继承SQLiteOpenHelper

public class DBHelper extends SQLiteOpenHelper {    
    private static final String DATABASE_NAME = "test.db";  
    private static final int DATABASE_VERSION = 1;        
    public DBHelper(Context context) {          //CursorFactory设置为null,使用默认值  
        super(context, DATABASE_NAME, null, DATABASE_VERSION);  
    }          
    @Override  
    public void onCreate(SQLiteDatabase db) {  //数据库第一次被创建时onCreate会被调用
        db.execSQL("CREATE TABLE IF NOT EXISTS person" +  
                "(_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age INTEGER, info TEXT)"); 
    }         
    @Override  //如果DATABASE_VERSION值被改为2,系统发现现有数据库版本不同,即会调用onUpgrade 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
        db.execSQL("ALTER TABLE person ADD COLUMN other STRING");  
    }  
}  

2、新建Person类,对应person表中的字段,设置数据的属性和一些行为,并提供获取属性和设置属性的get/set方法,Person是我们的person表对应的JavaBean(即model,又称模型层);

public class Person {  
    public int _id;  
    public String name;  
    public int age;  
    public String info;        
    public Person() {  
    }        
    public Person(String name, int age, String info) {  
        this.name = name;  
        this.age = age;  
        this.info = info;  
    }  
}  

3、创建DBManager是建立在DBHelper之上,封装常用的业务方法【增(INSERT)删(DELETE)改(UPDATE)查(SELECT)】;

public class DBManager {  
    private DBHelper helper;  
    private SQLiteDatabase db;        
    public DBManager(Context context) {  
        helper = new DBHelper(context);                                                                 //在DBManager构造方法中实例化DBHelper并获取一个SQLiteDatabase对象db,作为整个应用的数据库实例
//因为getWritableDatabase内部调用了mContext.openOrCreateDatabase(mName, 0, mFactory);  
//所以要确保context已初始化,我们可以把实例化DBManager的步骤放在Activity的onCreate里  
        db = helper.getWritableDatabase();                                                             //getReadableDatabase()获取实例,当然这个时候你获取的实例只能读不能写
    }  
    public void add(List<Person> persons) { //添加多个Person信息时,采用事务处理,确保数据完整性
        db.beginTransaction();  //开始事务  
        try {  
            for (Person person : persons) {  
                db.execSQL("INSERT INTO person VALUES(null, ?, ?, ?)", new Object[]{person.name, person.age, person.info});  
            }  
            db.setTransactionSuccessful();  //设置事务成功完成  
        } finally {  
            db.endTransaction();    //结束事务  
        }  
    }        
    public void updateAge(Person person) {  //更改项目
        ContentValues cv = new ContentValues();  
        cv.put("age", person.age);  
        db.update("person", cv, "name = ?", new String[]{person.name});  
    }  
    public void deleteOldPerson(Person person) {  //删除项目
        db.delete("person", "age >= ?", new String[]{String.valueOf(person.age)});  
    }  
    public List<Person> query() {  //查询项目
        ArrayList<Person> persons = new ArrayList<Person>();  
        Cursor c = queryTheCursor();  
        while (c.moveToNext()) {  
            Person person = new Person();  
            person._id = c.getInt(c.getColumnIndex("_id"));  
            person.name = c.getString(c.getColumnIndex("name"));  
            person.age = c.getInt(c.getColumnIndex("age"));  
            person.info = c.getString(c.getColumnIndex("info"));  
            persons.add(person);  
        }  
        c.close();  
        return persons;  
    }   
    public Cursor queryTheCursor() {  
        Cursor c = db.rawQuery("SELECT * FROM person", null);  
        return c;  
    }        
    public void closeDB() {  //关闭数据库
        db.close();  
    }  
}  

4、在主程序MainActivity中的应用

public class MainActivity extends Activity {       
    private DBManager mgr;  
    private ListView listView;        
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        listView = (ListView) findViewById(R.id.listView);          //初始化DBManager  
        mgr = new DBManager(this);  
    }        
    @Override  
    protected void onDestroy() {  
        super.onDestroy();          //应用的最后一个Activity关闭时应释放DB  
        mgr.closeDB();  
    }        
    public void add(View view) {  
        ArrayList<Person> persons = new ArrayList<Person>();            
        Person person1 = new Person("Ella", 22, "lively girl");  
        Person person2 = new Person("Jenny", 22, "beautiful girl");  
        Person person3 = new Person("Jessica", 23, "sexy girl");  
        Person person4 = new Person("Kelly", 23, "hot baby");  
        Person person5 = new Person("Jane", 25, "a pretty woman");            
        persons.add(person1);  
        persons.add(person2);  
        persons.add(person3);  
        persons.add(person4);  
        persons.add(person5);            
        mgr.add(persons);  
    }        
    public void update(View view) {  
        Person person = new Person();  
        person.name = "Jane";  
        person.age = 30;  
        mgr.updateAge(person);  
    }        
    public void delete(View view) {  
        Person person = new Person();  
        person.age = 30;  
        mgr.deleteOldPerson(person);  
    }        
    public void query(View view) {  
        List<Person> persons = mgr.query();  
        ArrayList<Map<String, String>> list = new ArrayList<Map<String, String>>();  
        for (Person person : persons) {  
            HashMap<String, String> map = new HashMap<String, String>();  
            map.put("name", person.name);  
            map.put("info", person.age + " years old, " + person.info);  
            list.add(map);  
        }  
        SimpleAdapter adapter = new SimpleAdapter(this, list, android.R.layout.simple_list_item_2,new String[]{"name", "info"}, new int[]{android.R.id.text1, android.R.id.text2});  
        listView.setAdapter(adapter); //遍历数据库的内容并显示到ListView 
    }        
    public void queryTheCursor(View view) {  
        Cursor c = mgr.queryTheCursor();  
        startManagingCursor(c); //托付给activity根据自己的生命周期去管理Cursor的生命周期  
        CursorWrapper cursorWrapper = new CursorWrapper(c) {  
            @Override  
            public String getString(int columnIndex) {            //将简介前加上年龄  
                if (getColumnName(columnIndex).equals("info")) {  
                    int age = getInt(getColumnIndex("age"));  
                    return age + " years old, " + super.getString(columnIndex);  
                }  
                return super.getString(columnIndex);  
            }  
        };  
        //确保查询结果中有"_id"列  
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, cursorWrapper, new String[]{"name", "info"}, new int[]{android.R.id.text1, android.R.id.text2});  
        ListView listView = (ListView) findViewById(R.id.listView);  
        listView.setAdapter(adapter);  
    }  
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值