zoukankan      html  css  js  c++  java
  • 安卓开发之SQLite(表的创建和更新)

      Android为了让我们能够更加方便地管理数据库,专门提供了一个SQLiteOpenHelper帮助类,我们可以借助这个类对数据库进行创建和升级.SQLiteOpenHelper中有两个抽象方法,分别是onCreate()和onUpgrade(),我们需要在自己的帮助类里面重写这两个方法,分别在这两个方法中去实现创建,升级数据库的逻辑.

      SQLiteOpenHelper有了两个非常重要的方法,getReadableDatabase()和getWritableDatabase().这两个方法都可以创建或者打开一个现有的数据库,(存在直接打开,不存在创建一个),并返回一个可对数据库进行读写操作的对象.

      当数据库不可写入(如磁盘空间已满),getReadableDatabase(0方法返回的对象将以只读的方式去打开数据库,而getWritableDatabase()方法则出现异常.

      SQLiteOpenHelper中有两个构造方法可供重写,一般使用参数少一点的那个构造方法即可.这个构造方法中接受4个参数,第一个参数是Context,必须要有它才能对数据库进行操作.第二个参数是数据库名,创建数据时使用的就是这里指定的名称,第三个参数语序我们在查询数据的适合返回一个自定义的cursor,一般传入null,第四个参数表示当前数据库的版本号,可用于对数据库进行升级操作,构建SQLiteOpenHelper的实例之后,在调用它的getReaableDatabase()或getWritableDatabase()方法就能创建数据库了.数据库文件存放在/data/data/<package name>/database/目录下.此时,重写onCreate()方法就会得到执行,所以通常在这里去处理一些创建表的逻辑.

      创建表时所需要用到的数据类型:integer(整型),real(浮点型),text(文本型),blob(二进制),

                 约束:primary key为主键,autoincrement关键字表示id列时自 增长的.

    实际操作代码:

    新建MyDatabaseHelper类继承自SQLiteOpenHelper,代码如下

    public class MyDatabaseOpenHelper extends SQLOpenHelper{
    
      public static final String CREAT_BOOK = "create table Book("
    
        +"id integer primary key autoincrement,"
        +"author text,"
    
        +"price real,"
        +"page inrteger,"
        +"name text)";
    
      private Context mContext;
    
      public MyDatabaseHelper(Context context,String name,SQLDatabse,CursorFactory     factory,int version){
    
          super(context,name,factory,version);
          mContext = context;
    
    }
    
    @Override
    
    public void onCreate(SQLiteDatabase db){
    
      db.exec(CREATE_BOOK);
    
    }
    
    @Override
    
    public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
    
    }
    
    }

    MainActivity.class中的代码

    public class MainActivity extends APPCompatActivity{
    
      private MyDatabaseHelper dbHelper;
    
      @Override
    
      protected void onCreate(Bundle saveInstanceState){
    
      super.onCreate(saveInstanceState);
    
      setContenView(R.layout.activity_main);
    
      dbHelper=new MyDatabaseOpenHelper(this,"BookStore.db",null,1);
    
      Button createDatabase =(Button)findViewById(R.id.create_database);
    
      createbase.setOnClickListener(new View.OnClickListener(){
    
      @Override
    
      public void onClick(View v){
    
      dbHelper.getWritableDatabase();
    
      }
    
    });
    
    }
    
    }

    布局文件

    ....
    
    <Button
    
      android:id="@+id/create_database"
    
      android:layout_width="match_parent"
    
      android:layout_height="wrap_parent"
    
    />
    
    </LinearLayout>

    到这里,第一个表的创建就完成了,但是如果我们想再创建一个表,应该怎么办呢?

    用同样的方法在onCreate()里面添加代码,如果我们这样尝试过,会发现表是没有办法创建的,这是因为BookStorre.db数据库已经存在了,代码中的onCreate就不会执行,我们可以选择卸载软件,重新安装或者使用onUpgrade()方法进行升级,

    public class MyDatabaseHelper extends SQLiteOpenHelper{
    
      ...
    
      @Override
    
      public void onUpgrade(SQLiteDatabase db,int oldversion,int newVersion){
    
      db.execSQL("drop table if exists Book");
    
      db.execSQl("drop table if exists Category") ;
    
      onCreate(db); 
    
    }
    
    }

    在这里,我们执行了drop语句,如果数据中已经存在Book或者Categroy,就会先删除掉,在调用onCreate重新创建,

    然后我们需要让onUpgrade()方法执行,只需要SQLiteOpenHelper的构造方法里接受的第四个参数,它表示当前的版本好,之前我传入的是1,现在只要传入一个比1大的数字,onUpgrade就会执行
    修改MainActivity,class中的代码即可,

    dbHelper =new MyDatabaseHelper(this,"BookStore.db,null,2");

    以上便是SQLiteDatbaseOpneHelper()的创建表和升级表.

  • 相关阅读:
    Lyndon Word & The Runs Theorem
    Codeforces 1477F. Nezzar and Chocolate Bars
    Codeforces Round #700 (Div.1)
    kubeadm 安装 k8s
    centos7更新阿里yum源
    CF1186 F. Vus the Cossack and a Graph
    CF1152 D. Neko and Aki's Prank
    CF803 C. Maximal GCD
    CF1180 B. Nick and Array
    CF1186 D. Vus the Cossack and Numbers
  • 原文地址:https://www.cnblogs.com/p-t-m/p/12892284.html
Copyright © 2011-2022 走看看