zoukankan      html  css  js  c++  java
  • 类数据[Android Training视频系列] 6.3 Saving Data in SQL Databases(保存数据到SQLite)

    今天朋友几篇文章介绍了改类数据的文章. 关联文章的地址

        一 主要内容

        1.概述
    2.义定Schema与Contract
    3.用使SQL Helper创立数据库
    4.向数据库添加信息
    5.从数据库中读取信息
    6.删除数据库中的信息
    7.更新数据库中的信息

        二 翻译载转

        

        

    对于复重或者结构化的数据(如联系人信息)等保存到DB是个不错的主张。这节课假设你已悉熟SQL数据库的作操。在Android上可能会用使到的APIs,可以从android.database.sqlite包中找到。

        

     

        

    Define a Schema and Contract [义定Schema与Contract]

        

    SQL中一其中要重的念概是schema:一种DB结构的正式声明。schema是从你创立DB的SQL语句中生成的。你可能会现发创立一个创立一个随同类(companion class)是很益有的,这个类成为合约类(contract class),它用一种系统化并且动自生成档文的方法,示显指定了你的schema款式。

    Contract Clsss是一些常量的器容。它义定了例如URIs, 表名,列名等。这个contract类答应你在同一个包下与其他类用使一样的常量。 它让你只须要在一个地方修改列名,然后这个列名以可就动自传递给你个整code。

    一个织组你的contract类的好方法是在你的类的根层级义定一些全局变量,然后为每个table来创立内部类。

    Note: 通过现实 BaseColumns 的口接,你的内部类可以继承到一个名为_ID主键,这个对于Android面里的一些相似cursor adaptor类是很有要必的。这样够能使得你的DB与Android的framework够能很好的相容。

    例如,上面的例子义定了表名与这个表的列名:

        

    public

        

        static

        

        abstract

        

        class

        

        FeedEntry

        

        implements

        

        BaseColumns

        

        {

        

        public

        

        static

        

        final

        

        String

         TABLE_NAME

        =

        

        "entry"

        ;

        

        public

        

        static

        

        final

        

        String

         COLUMN_NAME_ENTRY_ID

        =

        

        "entryid"

        ;

        

        public

        

        static

        

        final

        

        String

         COLUMN_NAME_TITLE

        =

        

        "title"

        ;

        

        public

        

        static

        

        final

        

        String

         COLUMN_NAME_SUBTITLE

        =

        

        "subtitle"

        ;

        

        ...

        

        }

        

    为了止防一些人不小心实例化contract类,像上面一样给一个空的构造器。

        

    // Prevents the FeedReaderContract class from being instantiated.

        

        private

        

        FeedReaderContract

        ()

        

        {}

        Create a Database Using a SQL Helper [用使SQL Helper创立DB]

        

    当你义定好了你的DB应当是什么样以后,你应当现实那些创立与维护db与table的方法。上面是一些典范的创立与删除table的语句。

        

    private

        

        static

        

        final

        

        String

         TEXT_TYPE

        =

        

        " TEXT"

        ;

        

        private

        

        static

        

        final

        

        String

         COMMA_SEP

        =

        

        ","

        ;

        

        private

        

        static

        

        final

        

        String

         SQL_CREATE_ENTRIES

        =

        

        "CREATE TABLE "

        

        +

        

        FeedReaderContract

        .

        FeedEntry

        .

        TABLE_NAME

        +

        

        " ("

        

        +

        

        FeedReaderContract

        .

        FeedEntry

        .

        _ID

        +

        

        " INTEGER PRIMARY KEY,"

        

        +

        

        FeedReaderContract

        .

        FeedEntry

        .

        COLUMN_NAME_ENTRY_ID

        +

         TEXT_TYPE

        +

         COMMA_SEP

        +

        

        FeedReaderContract

        .

        FeedEntry

        .

        COLUMN_NAME_TITLE

        +

         TEXT_TYPE

        +

         COMMA_SEP

        +

        

        ...

        

        // Any other options for the CREATE command

        

        " )"

        ;

        

        private

        

        static

        

        final

        

        String

         SQL_DELETE_ENTRIES

        =

        

        "DROP TABLE IF EXISTS "

        

        +

         TABLE_NAME_ENTRIES

        ;

        

     

    就像保存文件到备设的 internal storage 一样,Android会保存db到你的程序的private的空间上。你的数据是受护保的,因为那些区域默许是私有的,不可被其他程序所拜访。

    在 SQLiteOpenHelper 类中有一些很用有的APIs。当你用使这个类来做一些与你的db有关的作操时,系统会对那些有可能比拟耗时的作操(例如创立与更新等)在真正须要的时候才去行执,而不是在app刚启动的时候就去做那些动作。你所须要做的仅仅是行执 getWritableDatabase() 或者 getReadableDatabase().

    Note: 因为那些作操是能可很耗时的,请确保你在background thread(AsyncTask or IntentService)面里去行执 getWritableDatabase() 或者 getReadableDatabase() 。

    为了用使 SQLiteOpenHelper, 你须要创立一个子类并写重 onCreate()onUpgrade() 与 onOpen()等callback方法。你许也还须要现实 onDowngrade(), 但是这并非必须的。

    例如,上面是一个现实了SQLiteOpenHelper 类的例子:

        

    public

        

        class

        

        FeedReaderDbHelper

        

        extends

        

        SQLiteOpenHelper

        

        {

        

        // If you change the database schema, you must increment the database version.

        

        public

        

        static

        

        final

        

        int

         DATABASE_VERSION

        =

        

        1

        ;

        

        public

        

        static

        

        final

        

        String

         DATABASE_NAME

        =

        

        "FeedReader.db"

        ;

        

        public

        

        FeedReaderDbHelper

        (

        Context

         context

        )

        

        {

        

        super

        (

        context

        ,

         DATABASE_NAME

        ,

        

        null

        ,

         DATABASE_VERSION

        );

        

        }

        

        public

        

        void

         onCreate

        (

        SQLiteDatabase

         db

        )

        

        {

         db

        .

        execSQL

        (

        SQL_CREATE_ENTRIES

        );

        

        }

        

        public

        

        void

         onUpgrade

        (

        SQLiteDatabase

         db

        ,

        

        int

         oldVersion

        ,

        

        int

         newVersion

        )

        

        {

        

        // This database is only a cache for online data, so its upgrade policy is

        

        // to simply to discard the data and start over

         db

        .

        execSQL

        (

        SQL_DELETE_ENTRIES

        );

         onCreate

        (

        db

        );

        

        }

        

        public

        

        void

         onDowngrade

        (

        SQLiteDatabase

         db

        ,

        

        int

         oldVersion

        ,

        

        int

         newVersion

        )

        

        {

         onUpgrade

        (

        db

        ,

         oldVersion

        ,

         newVersion

        );

        

        }

        

        }

        

    为了拜访你的db,须要实例化你的  SQLiteOpenHelper 的子类:

        

        每日一道理
    共和国迎来了她五十诞辰。五十年像一条长河,有急流也有缓流;五十年像一幅长卷,有冷色也有暖色;五十年像一首乐曲,有低音也有高音;五十年像一部史诗,有痛苦也有欢乐。长河永远奔流,画卷刚刚展开,乐曲渐趋高潮,史诗还在续写。我们的共和国正迈着坚定的步伐,跨入新时代。
    FeedReaderDbHelper

         mDbHelper

        =

        

        new

        

        FeedReaderDbHelper

        (

        getContext

        ());

        Put Information into a Database [添加信息到DB]

        

    通过传递一个 ContentValues 对象到 insert() 方法:

        

    // Gets the data repository in write mode

        

        SQLiteDatabase

         db

        =

         mDbHelper

        .

        getWritableDatabase

        ();

        

        // Create a new map of values, where column names are the keys

        

        ContentValues

         values

        =

        

        new

        

        ContentValues

        ();

         values

        .

        put

        (

        FeedReaderContract

        .

        FeedEntry

        .

        COLUMN_NAME_ENTRY_ID

        ,

         id

        );

         values

        .

        put

        (

        FeedReaderContract

        .

        FeedEntry

        .

        COLUMN_NAME_TITLE

        ,

         title

        );

         values

        .

        put

        (

        FeedReaderContract

        .

        FeedEntry

        .

        COLUMN_NAME_CONTENT

        ,

         content

        );

        

        // Insert the new row, returning the primary key value of the new row

        

        long

         newRowId

        ;

         newRowId

        =

         db

        .

        insert

        (

        

        FeedReaderContract

        .

        FeedEntry

        .

        TABLE_NAME

        ,

        

        FeedReaderContract

        .

        FeedEntry

        .

        COLUMN_NAME_NULLABLE

        ,

         values

        );

        

     insert() 方法的第一个参数是table名,第二个参数会使得系统动自对那些 ContentValues 没有供给数据的列填充数据为null,如果第二个参数传递的是null,那么系统则不会对那些没有供给数据的列停止填充。

     

     

    Read Information from a Database [从DB中读取信息]

    为了从DB中读取数据,须要用使  query()  方法, 传递你须要询查的件条。询查后会返回一个   Cursor  对象。

        

    SQLiteDatabase

         db

        =

         mDbHelper

        .

        getReadableDatabase

        ();

        

        // Define a

        projection

         that specifies which columns from the database

        

        // you will actually use after this query.

        

        String

        []

         projection

        =

        

        {

        

        FeedReaderContract

        .

        FeedEntry

        .

        _ID

        ,

        

        FeedReaderContract

        .

        FeedEntry

        .

        COLUMN_NAME_TITLE

        ,

        

        FeedReaderContract

        .

        FeedEntry

        .

        COLUMN_NAME_UPDATED

        ,

        

        ...

        

        };

        

        // How you want the results sorted in the resulting Cursor

        

        String

         sortOrder

        =

        

        FeedReaderContract

        .

        FeedEntry

        .

        COLUMN_NAME_UPDATED

        +

        

        " DESC"

        ;

        

        Cursor

         c

        =

         db

        .

        query

        (

        

        FeedReaderContract

        .

        FeedEntry

        .

        TABLE_NAME

        ,

        

        // The table to query

         projection

        ,

        

        // The columns to return

         selection

        ,

        

        // The columns for the WHERE clause

         selectionArgs

        ,

        

        // The values for the WHERE clause

        

        null

        ,

        

        // don't group the rows

        

        null

        ,

        

        // don't filter by row groups

         sortOrder

        // The sort order

        

        );

        

    上面是演示如何从course对象中读取数据信息:

        

    cursor

        .

        moveToFirst

        ();

        

        long

         itemId

        =

         cursor

        .

        getLong

        (

         cursor

        .

        getColumnIndexOrThrow

        (

        FeedReaderContract

        .

        FeedEntry

        .

        _ID

        )

        

        );

        Delete Information from a Database [删除DB中的信息]

        

    和询查信息一样,删除数据,一样须要供给一些删除准标。DB的API供给了一个止防SQL入注的制机来创立询查与删除准标。 

     

    SQL Injection[随着B/S式模应用开发的开展,用使这类式模编写应用程序的程序员也越来越多。但是由于程序员的水平及验经也齐不差参,相当大一分部程序员在编写代码的时候,没有对户用入输数据的合法性停止判断,使应用程序存在安全隐患。户用可以提交一段数据库询查代码,根据程序返回的结果,取得某些他想知得的数据,这就是所谓的SQL Injection,即SQL入注。]

    这个制机把询查语句划分为选项款条与选项参数两分部。款条分部义定了询查的列是怎么样的,参数分部用来测试是不是符合面前的款条。[这里翻译的怪怪的,附上原文,The clause defines the columns to look at, and also allows you to combine column tests. The arguments are values to test against that are bound into the clause.] 因为理处的结果与常通的SQL语句不同,这样可以防止SQL入注题问。

        

    / Define 'where' part of query.

        

        String

         selection

        =

        

        FeedReaderContract

        .

        FeedEntry

        .

        COLUMN_NAME_ENTRY_ID

        +

        

        " LIKE ?"

        ;

        

        // Specify arguments in placeholder order.

        

        String

        []

         selelectionArgs

        =

        

        {

        

        String

        .

        valueOf

        (

        rowId

        )

        

        };

        

        // Issue SQL statement.

         db

        .

        delete

        (

        table_name

        ,

         mySelection

        ,

         selectionArgs

        );

        

    Update a Database [更新数据]

     

    当你须要修改DB中的某些数据时,用使 update() 方法。

    更新作操结合了插入与删除的语法。

        

    SQLiteDatabase

         db

        =

         mDbHelper

        .

        getReadableDatabase

        ();

        

        // New value for one column

        

        ContentValues

         values

        =

        

        new

        

        ContentValues

        ();

         values

        .

        put

        (

        FeedReaderContract

        .

        FeedEntry

        .

        COLUMN_NAME_TITLE

        ,

         title

        );

        

        // Which row to update, based on the ID

        

        String

         selection

        =

        

        FeedReaderContract

        .

        FeedEntry

        .

        COLUMN_NAME_ENTRY_ID

        +

        

        " LIKE ?"

        ;

        

        String

        []

         selelectionArgs

        =

        

        {

        

        String

        .

        valueOf

        (

        rowId

        )

        

        };

        

        int

         count

        =

         db

        .

        update

        (

        

        FeedReaderDbHelper

        .

        FeedEntry

        .

        TABLE_NAME

        ,

         values

        ,

         selection

        ,

         selectionArgs

        );

        

        三 视频解讲

        

        http://www.eyeandroid.com/thread-14567-1-1.html

        类和数据

        

        

        

    文章结束给大家分享下程序员的一些笑话语录: 古鸽是一种搜索隐禽,在中国快绝迹了…初步的研究表明,古鸽的离去,很可能导致另一种长着熊爪,酷似古鸽,却又习性不同的猛禽类——犤毒鸟

  • 相关阅读:
    【FPGA】结构化层次化设计
    【FPGA】库、包和子程序 过程 函数
    【FPGA】8位奇偶校验 / 加(减)法器 VHDL程序
    【FPGA】顺序语句
    【FPGA】并行语句
    【FPGA】VHDL基础
    Luogu P3349 小星星
    Luogu P4284 概率充电器
    NOIP2018 | D2T2 & D2T3
    二项式反演 小记
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3063525.html
Copyright © 2011-2022 走看看