• Android之SQLite总结


    SQLite 是一个轻量级的数据库,常用于各种嵌入式设备当中。
    android 提供了SQLiteOpenHelper抽象类用于帮助开发数据库。
    在实际使用中经常定义一个类继承SQLiteOpenHelper,并重写构造方法,onCreate()方法和 onUpdate()的方法;
    //注意:上面三个方法必须重写:重写构造方法一般用于初始化
                                                              onCreate()方法:
                                                               onUpdate()用于数据库版本的更新时调用,只在数据库更新时调用一次。

    如:MySQLiteHelper类继承SQLiteOpenHelper
    // MySQLiteOpenHelper extends SQLiteOpenHelper;
    //MySQLiteOpenHelper myhelper;
    myhelper = new MySQLiteOpenHelper(contenext);


    ** SQLiteDatabase是直接操作数据库的对象,可以使用SQLiteOpenHelper的 getReadableDatabase
    或getWritableDatabase方法得到SQLiteDatabase对象。
    //SQLiteDatabase db = myhelper.getReadableDatabase();
    //注意:只有调用了getReadableDatabase()或getWritableDatabase方法,才算真正创建了数据库,接下来就可以使用数据库的各种方法,
    处理数据;

    查询结果的返回值:Cursor cursor ;Cursor相当于结果集ResulytSet;
    Cursor是一个游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等.
    总结:使用SQLite的一般步骤:
               a:自定义一个继承SQLiteOpenHelper的类,然后使用数据库帮助类的对象调用getReadableDatabase()或getWritableDatabase方法创建数据库
              b: 对数据库db进行增删改查的操作
              c:对于查询的结果集储存在Cursor中。
             d:数据库db和结果集Cursor使用完毕后注意调用close的方法来释放资源

    http://wenku.baidu.com/view/423a00dca58da0116c17491e.html
    //该文档比较长比较详细

    package com.itheima.db;
    
    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteDatabase.CursorFactory;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.view.View;
    
    public class PersonSQLiteOpenHelper extends SQLiteOpenHelper {
        /*数据库的构造方法,
        用来定义数据库的名称,
        数据库的结果集和数据库的版本
        创建出一个Person的数据库
        */
        public PersonSQLiteOpenHelper(Context context) {
            super(context, "Person.db", null, 1);
            /*        
             * 一共四个参数,每个参数的含义:1.context上下文,一般都需要
                2:数据库的名字
                游标工厂:移动的指针指向结果集,一般游标工厂用null;
                version:代表数据库的版本。从1开始的,一般使用1;
             */    
        }
        
    
        /*
         * 在数据库第一次创建的时候使用onCreate(),
         * 一般用来创建数据库的表结构和存一些初始化的表参数
         * 传入的参数db代表被创建的数据库
         * */
        @Override
        public void onCreate(SQLiteDatabase db) {
            
            //初始化表结构
            db.execSQL("create table person (id integer primary key autoincrement,name varchar(20),number varchar(20))");
            //注意:SQLite 实际上是一个嵌入式的数据库,没有MySQL那么多的数据类型。
    
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub
    
        }
    
    }

    以上代码是创建了一个继承了SQLiteOpenHelper的类。

    package com.itheima.db.dao;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    
    import com.itheima.db.PersonSQLiteOpenHelper;
    import com.itheima.db.domain.Person;
    
    public class PersonDao {
        //因为要对helper进行操作,所以该类需要有一个helper的对象
        private PersonSQLiteOpenHelper helper;
        public PersonDao(Context context){
            helper = new PersonSQLiteOpenHelper(context);
            
        }
        //任何一个函数的构造方法都要传入context的对象,因为context相当于全局变量为整个应用的接口
        //这样写代码的好处,在构造方法中已经将personhelper初始化
        //养成习惯:只要一拿到数据库就在后面写上close的方法。
        public void insert(String name , String num){
            SQLiteDatabase db = helper.getWritableDatabase();
            db.execSQL("insert into person (name,number) vlaues(?,?) ",new Object[]{name ,num});
            db.close();
        }
        //数据库db,只有在helper调用了getWritableDatabase()或者getReadableDatabase()的方法后才会被创建出来
        //使用任何一个数据库最后都要关闭数据库来释资源,所以当你在开始创建数据库的时候就直接关闭数据库以防忘记
        //数据库db可以调用execSQl的方法来执行SQL语句,SQL语句中的?代表了占位符可以用参数实现
        
        public void delete(String name){
            SQLiteDatabase db = helper.getWritableDatabase();
            db.execSQL("delete from person where name =?",new Object[]{name});
            
            db.close();
        }
        
        public void  update(String name ,String newname ){
            
            SQLiteDatabase db = helper.getWritableDatabase();
            db.execSQL("update person set name =? where name =?",new Object[]{name,newname} );
            db.close();
            
        }
        public boolean find(String name){
            SQLiteDatabase db = helper.getReadableDatabase();
                Cursor cursor = db.rawQuery("select * from person where name = ?", new String[]{name});
                boolean result = cursor.moveToNext();
                cursor.close();
            db.close();
            return result;
        }
        //cursor使用完也要关闭来释放资源。cursor的常用方法要掌握
        public List<Person> findAll(){
            SQLiteDatabase db = helper.getReadableDatabase();
            Cursor cursor = db.rawQuery("select * from person",null);
            List<Person>  list = new ArrayList<Person>();
            while(cursor.moveToNext()){
                
                int id = cursor.getInt(0);
                String name  = cursor.getString(1);
                String number = cursor.getString(2);
                Person p = new Person(name,number,id);
                list.add(p);
                
            }
            cursor.close();
            db.close();
            return list;
            
        }
    }
    //以上是使用SQL语句是实现的增删改查
    //可以使用Android 提供的API来实现增删改查的
    //使用SQL语句比较麻烦,会出现一些小细节的错误

    编写一个Dao类用于操作数据库。

    package com.itheima.db.domain;
    
    public class Person {
        private String name;
        private String number;
        private int id;
    
        public Person(String name, String number, int id) {
            super();
            this.name = name;
            this.number = number;
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getNumber() {
            return number;
        }
        public void setNumber(String number) {
            this.number = number;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        
    
    }
    //创建PersonBean类来封装查询到的结果,快捷键右键source,生成getter 和setter的方法,右键source还可以生成构造方法
    //一般 构造方法的作用是初始化对象参数值

    //自定义了一个Person类用来封装查询结果。

    package com.itheima.db;
    
    import android.support.v7.app.ActionBarActivity;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    
    
    public class MainActivity extends ActionBarActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
    
        @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);
            PersonSQLiteOpenHelper helper = new PersonSQLiteOpenHelper(this);
          /*  //只执行以上代码实际数据库并没有被创建出来,单纯的new出来了一个对象
            helper.getReadableDatabase();
            helper.getWritableDatabase();
            //只有执行以上的两种方法中任意一种数据库才被创建出来
           */     
            helper.getReadableDatabase();
            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);
        }
    }

    //主函数

  • 相关阅读:
    C++ 根据对象名字创建对象
    Google是如何测试的(一)
    lex yacc 学习
    C语言宏定义时#(井号)和##(双井号)的用法
    更多编译器对C++11的支持比较
    用C++11替代Boost的实验之三
    最先进的开源游戏引擎KlayGE 4.2发布
    各编译器对C++11的支持比较
    在Android模拟器上的一些小陷阱
    推出KlayGE Foundation Library
  • 原文地址:https://www.cnblogs.com/taotaomajia/p/4462782.html
Copyright © 2020-2023  润新知