zoukankan      html  css  js  c++  java
  • Android学习——创建数据库

    创建数据库

        Android为了让我们能够更加方便地管理数据库,专门提供了一个 SQLiteOpenHelper帮助类, 借助这个类就可以非常简单地对数据库进行创建和升级。

        SQLiteOpenHelper是一个抽象类,其中有两个抽象方法分别是onCreate()和onUpgrade(),分别在这两个方法中实现创建和升级数据库的逻辑。

        SQLiteOpenHelper还有两个十分重要的实例方法,getReadableDatabase()和getWritableDatabase()。这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,如果不存在则创建一个),并返回一个可对数据库进行读写操作的对象。不同的是,当数据库不可写入的时候(如磁盘空间已满)getReadableDatabase()方法返回的对象将以只读的方式去打开数据库,而getWritableDatabase()将抛出异常。

        SQLiteOpenHelper中有两个构造方法可以重写,一般使用参数少的那个构造方法即可。这个构造方法接收四个参数,第一个是Context 。第二个是数据库名。第三个参数允许我们在查询数据的时候返回一个自定义的Cursor,一般都是传入null。第四个参数是当前数据库的版本号,可用于对数据库进行升级操作。构建出SQLiteOpenHelper的实例之后,再调用它的getReadableDatabase()或getWritableDatabase()方法就能够创建数据库了,数据库文件会存放在/data/data/<package name>/databases/目录下。此时重写的onCreate()方法也会得到执行,所以通常会在这里去处理一些创建表的逻辑。


     创建一个项目DatabaseDemo,新建MyDatabaseHelper类从SQLiteOpenHelper继承:

     1 package ga.orlion.databasedemo;
     2 
     3 
     4 import android.content.Context;
     5 
     6 import android.database.sqlite.SQLiteDatabase;
     7 
     8 import android.database.sqlite.SQLiteDatabase.CursorFactory;
     9 
    10 import android.widget.Toast;
    11 
    12 import android.database.sqlite.SQLiteOpenHelper;
    13 
    14  
    15 
    16 public class MyDatabaseHelper extends SQLiteOpenHelper {
    17  
    18 
    19  
    20 
    21         public static final String CREATE_BOOK = "create table book ("
    22 
    23 + "id integer primary key autoincrement, "
    24 
    25 + "author text, "
    26 
    27 + "price real, "
    28 
    29 + "pages integer, "
    30 
    31 + "name text)";
    32 
    33  
    34 
    35 private Context mContext;
    36 
    37  
    38 
    39 public MyDatabaseHelper(Context context, String name, CursorFactory factory, int version) {
    40 
    41 super(context, name, factory, version);
    42 
    43 mContext = context;
    44 
    45 }
    46 
    47  
    48 
    49 @Override
    50 
    51 public void onCreate(SQLiteDatabase db) {
    52 
    53  
    54 
    55 db.execSQL(CREATE_BOOK);
    56 
    57 Toast.makeText(mContext, "数据库创建了", Toast.LENGTH_SHORT).show();
    58 
    59 }
    60 
    61  
    62 
    63 @Override
    64 
    65 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    66 
    67  
    68 
    69 }
    70 
    71 }

        SQLite不像其他的数据库拥有众多繁杂的数据类型, 它的数据类型很简单, integer表示整型,real表示浮点型,text表示文本类型,blob表示二进制类型。另外,上述建表语句中我们还使用了 primary key将 id列设为主键,并用 autoincrement关键字表示 id列是自增长的。

        我们把建表语句定义成了一个字符串常量,然后在 onCreate()方法中又调用了 SQLiteDatabase的 execSQL()方法去执行这条建表语句,并弹出一个 Toast提示创建成功。

    修改activity_main.xml:

     1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2 
     3     android:layout_width="match_parent"
     4 
     5 android:layout_height="match_parent"
     6 
     7 android:orientation="vertical" >
     8 
     9     
    10 
    11     <Button
    12 
    13         android:id="@+id/create_database"
    14 
    15         android:layout_width="match_parent"
    16 
    17         android:layout_height="wrap_content"
    18 
    19         android:text="创建数据库" />
    20 
    21 </LinearLayout>

      布局文件很简单,就是加入了一个按钮,用于创建数据库。最后修改 MainActivity中的代码:

     super.onCreate(savedInstanceState);
    
    setContentView(R.layout.activity_main);
    
    dbHelper = new MyDatabaseHelper(this , "BookStore.db" , null , 1);
    
    Button button = (Button) findViewById(R.id.create_database);
    
    button.setOnClickListener(new View.OnClickListener() {
    
     
    
    @Override
    
    public void onClick(View v) {
    
    dbHelper.getWritableDatabase();
    
    }
    
    });

    我们在 onCreate()方法中构建了一个 MyDatabaseHelper对象,并且通过构造函数的参数将数据库名指定为 BookStore.db,版本号指定为 1,然后在 Create database按钮的点击事件里调用了getWritableDatabase()方法。这样当第一次点击Create database按钮时,就会检测到当前程序中并没有BookStore.db这个数据库, 于是会创建该数据库并调用MyDatabaseHelper中的 onCreate()方法,这样 Book表也就得到了创建,然后会弹出一个 Toast提示创建成功。再次点击 Create database按钮时,会发现此时已经存在 BookStore.db数据库了,因此不会再创建一次。

  • 相关阅读:
    BOI 2002 双调路径
    BOI'98 DAY 2 TASK 1 CONFERENCE CALL Dijkstra/Dijkstra+priority_queue/SPFA
    USACO 2013 November Contest, Silver Problem 2. Crowded Cows 单调队列
    BOI 2003 Problem. Spaceship
    USACO 2006 November Contest Problem. Road Blocks SPFA
    CEOI 2004 Trial session Problem. Journey DFS
    USACO 2015 January Contest, Silver Problem 2. Cow Routing Dijkstra
    LG P1233 木棍加工 动态规划,Dilworth
    LG P1020 导弹拦截 Dilworth
    USACO 2007 February Contest, Silver Problem 3. Silver Cow Party SPFA
  • 原文地址:https://www.cnblogs.com/znjy/p/14908092.html
Copyright © 2011-2022 走看看