zoukankan      html  css  js  c++  java
  • 【Android】Android连接SQLite3数据库的操作

    在前面使用SQLite3的时候,并没有留意到有SQLiteOpenHelper这个类,所以只好在Activity里面去创建和维护数据库跟数据表的创建。

    但是,现在有了SQLiteOpenHelper这个类,就可以把数据库和数据表,以及一些初始化的数据的维护跟Activity分开了。。。

    数据库和数据表结构的创建,是只需要执行一次的,而打开数据库获取数据库相应的SQLiteDatabase操作类则有可能是每次运行程序都需要执行的,如何把这两个步骤操作合理的放到一个辅助类里面呢?SQLiteOpenHelper!木错!就是这个类,只需要继承这个类,调用构造函数SQLiteOpenHelper(Context context, String name, CursorFactory factory,int version)然后重写onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)这两个方法即可(不过好像我只是使用了onCreate...)。

    下面说一下这个类的大概原理,假设你的SQLiteHelper继承于SQLiteOpenHelper类,调用SQLiteOpenHelper的构造函数并且实现了onCreate和断onUpgrade,当你在程序中调用getWritableDatabase()方法的时候,会自动去检查你的databases目录,如果里面不存在你需要打开的数据库文件,则会自动调用你所写的方法onCreate,然后返回你所创建的数据库表象,如果已经存在则会直接返回该数据库的表象。这样,我们初始化的数据库表,跟默认数据就可以放到onCreate函数里面去实现。。。

    继承的类构造函数里面必须调用父类(SQLiteOpenHelper)的构造函数SQLiteOpenHelper(Context context, String name, CursorFactory factory,int version)。

    context是为打开创建数据库库用的,name是数据库的文件名称,factory设置为空使用默认的,version是创建或打开的数据库的版本号,这个必须大于等于1

    如果这一次的version版本和上一次打开的version不一致的时候,SQLiteOpenHelper就会自动调用onUpgrade方法。。

    对了,在Activity中,如果打开了数据库,一定要记得关闭!!!

     

    测试SQLiteOpenHelper的一个代码框架,

    SQLiteHelper.java

        package com.Yao_GUET.test;  
          
        import android.content.Context;  
        import android.database.SQLException;  
        import android.database.sqlite.SQLiteDatabase;  
        import android.database.sqlite.SQLiteDatabase.CursorFactory;  
        import android.database.sqlite.SQLiteOpenHelper;  
        import android.util.Log;  
          
        /** 
         * SQLite3数据库辅助类 
         * @author Yao.GUET 
         * blog: http://blog.csdn.net/Yao_GUET 
         * date: 2011-07-06 
         */  
          
        public class SQLiteHelper extends SQLiteOpenHelper {  
            private final static String TAG = "SQLiteHelper";  
              
            public SQLiteHelper(Context context, String name, CursorFactory factory,  
                    int version) {  
                super(context, name, factory, version);  
                // TODO Auto-generated constructor stub  
            }  
          
            @Override  
            public void onCreate(SQLiteDatabase db) {  
                // TODO Auto-generated method stub  
                Log.e(TAG, "SQLitehelper onCreate!");  
                try {  
                    db.execSQL("Create TABLE  Data( " +  
                            "ID integer Primary Key AUTOINCREMENT, " +  
                            "UserName varchar(50) " +  
                            ")");  
                    Log.e(TAG, "createDataTable OK!");  
                } catch (SQLException se) {  
                    se.printStackTrace();  
                }  
            }  
          
            @Override  
            public void onOpen(SQLiteDatabase db) {  
                // TODO Auto-generated method stub  
                Log.e(TAG, "SQLiteHelper on Open!");  
                super.onOpen(db);  
            }  
          
            @Override  
            public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
                // TODO Auto-generated method stub  
                Log.e(TAG, "SQLitehelper onUpgrade!");  
            }  
          
        }  

    测试Activity

    SQLiteHelperTest.java

        package com.Yao_GUET.test;  
          
        import android.app.Activity;  
        import android.database.sqlite.SQLiteDatabase;  
        import android.os.Bundle;  
        import android.util.Log;  
        import android.view.KeyEvent;  
        import android.widget.Button;  
        import android.widget.TextView;  
          
        public class SQLiteHelperTest extends Activity {  
            private final static String TAG = "SQLiteHelperTest";  
              
            private SQLiteHelper sqlHelper;  
            private SQLiteDatabase db;  
              
            @Override  
            protected void onCreate(Bundle savedInstanceState) {  
                // TODO Auto-generated method stub  
                super.onCreate(savedInstanceState);  
                setContentView(R.layout.sqlitehelper_test);  
                  
                sqlHelper = new SQLiteHelper(this, "test2.db", null, 2);  
                db = sqlHelper.getWritableDatabase();  
            }  
          
            @Override  
            protected void onDestroy() {  
                // TODO Auto-generated method stub  
                Log.e(TAG, "onDestroy!");  
                if (db != null)  
                    db.close();  
                super.onDestroy();  
            }  
          
            @Override  
            protected void onPause() {  
                // TODO Auto-generated method stub  
                Log.e(TAG, "onPause");  
                super.onPause();  
            }  
        }  

     可以按照如下的思路来操作,sqlite数据库,

    public class MainActivity extends Activity {
        private final static String TAG = "SQLiteHelperTest";  
        
        private SQLiteHelper sqlHelper;  
        private SQLiteDatabase db;  
          
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            sqlHelper = new SQLiteHelper(this, "test.db", null, 1); 
            db = sqlHelper.getWritableDatabase();
            //如果不存在这个表,那么创建
            db.execSQL("Create TABLE if not exists  MyData( " +  
                    "ID integer Primary Key AUTOINCREMENT, " +  
                    "UserName varchar(50) not null,"+
                    "Password varchar(50) not null,"+
                    "expire TEXT not null"+
                    ")");
            //插入数据
            db.execSQL("insert into MyData(UserName,Password,expire) values('abc','abc','2018-03-13 00:00:00')");
            //修改数据
            db.execSQL("update MyData set UserName='def' where ID=1");
            db.close();
            //查询数据
            db=sqlHelper.getReadableDatabase();
            Cursor cursor= db.rawQuery("select * from MyData", null);
            while(cursor.moveToNext()){
                int index= cursor.getColumnIndex("ID");
                int id= cursor.getInt(index);
                index=cursor.getColumnIndex("UserName");
                String name=cursor.getString(index);
                index=cursor.getColumnIndex("Password");
                String password=cursor.getString(index);
                index=cursor.getColumnIndex("expire");
                String expire=cursor.getString(index);
                Log.i("info", id+","+name+","+password+","+expire);
            }
            db.close();
            
        }
    }

    Sqlite数据库的文件路径是 /data/data/包名/databases/数据库名,可以看出在sqllite中,是以每个数据库名作为一个文件进行存储的。需要注意的是data/data文件夹下的内容必需在手机root之后才能看见。

  • 相关阅读:
    双击返回 退出程序
    读取InputStream 中的内容
    wsgi服务器
    python 中的GIL
    json
    __getattr__
    错误类型
    __slot__用法
    获取属性以及基本方法
    linux IO
  • 原文地址:https://www.cnblogs.com/HDK2016/p/7684780.html
Copyright © 2011-2022 走看看