Android 使用SQLite本地資料庫

来源:http://www.cnblogs.com/gisoracle/archive/2016/02/24/5212663.html
-Advertisement-
Play Games

參考:http://blog.csdn.net/jianghuiquan/article/details/8569252 在Android平臺上,集成了一個嵌入式關係型資料庫—SQLite。以SQLite是一款輕型資料庫:SQLite3支持 NULL、INTEGER、REAL(浮點數字)、TEXT(


參考:http://blog.csdn.net/jianghuiquan/article/details/8569252

在Android平臺上,集成了一個嵌入式關係型資料庫—SQLite。以SQLite是一款輕型資料庫:SQLite3支持 NULL、INTEGER、REAL(浮點數字)、TEXT(字元串文本)和BLOB(二進位對象)數據類型,雖然它支持的類型只有五種,但實際上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等數據類型,只不過在運算或保存時會轉成對應的五種數據類型。

  SQLite可以解析大部分標準SQL語句。

 

一、設計界面

  1、佈局文件

  打開activity_main.xml文件。
  輸入以下代碼:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#EFEFEF">

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/prompt"
        android:textColor="@drawable/black" />

    <EditText
        android:id="@+id/editbook"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textColor="@drawable/black" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="作者:"
        android:textColor="@drawable/black" />

    <EditText
        android:id="@+id/editauthor"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textColor="@drawable/black" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="出版社:"
        android:textColor="@drawable/black" />

    <EditText
        android:id="@+id/editpublisher"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textColor="@drawable/black" />

    <ListView
        android:id="@+id/listview"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/black" />


</LinearLayout>

2、自定義列表文件

  打開list.xml文件。
  輸入以下代碼:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <CheckedTextView android:id="@+id/textbookname"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/list_drive1" />
    <CheckedTextView android:id="@+id/textauthor"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/list_drive1" />

    <CheckedTextView android:id="@+id/textpublisher"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

color.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <drawable name="black">#000000</drawable>
    <drawable name="list_drive">#00000FFF</drawable>
    <drawable name="white">#FFFFFFFF</drawable>
    <drawable name="gray">#EFEFEF</drawable>
</resources>  

 

 

string.xml

<resources>
    <string name="app_name">My</string>

    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>
    <string name="prompt">書名:(請使用菜單:完成新增、修改、查詢、刪除記錄)</string>
    <string name="addrec">新增</string>
    <string name="editrec">修改</string>
    <string name="queryrec">查詢</string>
    <string name="delrec">刪除</string>
</resources>

 

二、程式文件

  1、SQLiteHelper.java文件

 
  然後輸入以下代碼:

package com.example.yanlei.my;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class SQLiteHelper extends SQLiteOpenHelper {

    private final static String DATABASE_NAME = "Library";
    private final static int DATABASE_VERSION = 1;
    private final static String TABLE_NAME = "Book";

    //構造函數,創建資料庫
    public SQLiteHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    //建表
    public void onCreate(SQLiteDatabase db) {
        String sql = "CREATE TABLE " + TABLE_NAME
                + "(_id INTEGER PRIMARY KEY,"
                + " BookName VARCHAR(30)  NOT NULL,"
                + " Author VARCHAR(20),"
                + " Publisher VARCHAR(30))";
        db.execSQL(sql);
    }


    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        String sql = "DROP TABLE IF EXISTS " + TABLE_NAME;
        db.execSQL(sql);
        onCreate(db);
    }

    //獲取游標
    public Cursor select() {
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.query(TABLE_NAME, null, null, null, null, null, null);
        return cursor;
    }

    //插入一條記錄
    public long insert(String bookName,String author,String publisher ) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put("BookName", bookName);
        cv.put("Author", author);
        cv.put("Publisher", publisher);
        long row = db.insert(TABLE_NAME, null, cv);
        return row;
    }

    //根據條件查詢
    public Cursor query(String[] args) {
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery("SELECT * FROM "+TABLE_NAME+" WHERE BookName LIKE ?", args);
        return cursor;
    }

    //刪除記錄
    public void delete(int id) {
        SQLiteDatabase db = this.getWritableDatabase();
        String where ="_id = ?";
        String[] whereValue = { Integer.toString(id) };
        db.delete(TABLE_NAME, where, whereValue);
    }

    //更新記錄
    public void update(int id, String bookName,String author,String publisher) {
        SQLiteDatabase db = this.getWritableDatabase();
        String where = "_id = ?";
        String[] whereValue = { Integer.toString(id) };
        ContentValues cv = new ContentValues();
        cv.put("BookName", bookName);
        cv.put("Author", author);
        cv.put("Publisher", publisher);
        db.update(TABLE_NAME, cv, where, whereValue);
    }
}  

 2、MainActivity.java文件

 
  然後輸入以下代碼:

package com.example.yanlei.my;

import android.database.Cursor;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class MainActivity extends AppCompatActivity {

    private SQLiteHelper helper;
    private Cursor cursor;
    private ListView lvBook;
    private EditText editBook;
    private EditText editAuthor;
    private EditText editPublisher;

    private int id = 0;

    protected final static int MENU_ADD = Menu.FIRST;
    protected final static int MENU_EDIT = Menu.FIRST + 1;
    protected final static int MENU_QUERY = Menu.FIRST + 2;
    protected final static int MENU_DELETE = Menu.FIRST + 3;

    //執行菜單選項
    public boolean onOptionsItemSelected(MenuItem item) {
        super.onOptionsItemSelected(item);
        switch (item.getItemId()) {
            case MENU_ADD:
                this.addRec();
                break;
            case MENU_EDIT:
                this.editRec();
                break;
            case MENU_QUERY:
                this.queryRec();
                break;
            case MENU_DELETE:
                this.deleteRec();
                break;
        }
        return true;
    }

    //初始化菜單
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        menu.add(Menu.NONE, MENU_ADD, 0, R.string.addrec).setIcon(android.R.drawable.ic_menu_add);
        menu.add(Menu.NONE, MENU_EDIT, 0, R.string.editrec).setIcon(android.R.drawable.ic_menu_edit);
        menu.add(Menu.NONE, MENU_QUERY, 0, R.string.queryrec).setIcon(android.R.drawable.ic_menu_search);
        menu.add(Menu.NONE, MENU_DELETE, 0, R.string.delrec).setIcon(android.R.drawable.ic_menu_delete);
        return true;
    }


    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        lvBook = (ListView) this.findViewById(R.id.listview);
        editBook = (EditText) this.findViewById(R.id.editbook);
        editAuthor = (EditText) this.findViewById(R.id.editauthor);
        editPublisher = (EditText) this.findViewById(R.id.editpublisher);

        //表中內容填充到自定義ListView
        helper = new SQLiteHelper(this);
        cursor = helper.select();
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(
                this,
                R.layout.list,
                cursor,
                new String[]{"BookName", "Author", "Publisher"},
                new int[]{R.id.textbookname, R.id.textauthor, R.id.textpublisher}
        );
        lvBook.setAdapter(adapter);

        // lvBook設置OnItemClickListener監聽事件
        lvBook.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
                cursor.moveToPosition(arg2);          // 將cursor移到所點擊的值
                id = cursor.getInt(0);                // 取得欄位_id的值
                editBook.setText(cursor.getString(1));    // 取得欄位Rec_text的值
                editAuthor.setText(cursor.getString(2));
                editPublisher.setText(cursor.getString(3));
            }
        });

    }

    //添加記錄
    private void addRec() {
        if (editBook.getText().toString().equals(""))
            return;
        helper.insert(editBook.getText().toString(), editAuthor.getText().toString(), editPublisher.getText().toString());
        //重新載入數據
        cursor.requery();
        lvBook.invalidateViews();
        editBook.setText("");
        editAuthor.setText("");
        editPublisher.setText("");
    }

    // 修改記錄
    private void editRec() {
        if (editBook.getText().toString().equals(""))
            return;
        helper.update(id, editBook.getText().toString(), editAuthor.getText().toString(), editPublisher.getText().toString());

        //重新載入數據
        cursor.requery();
        lvBook.invalidateViews();
        editBook.setText("");
        editAuthor.setText("");
        editPublisher.setText("");
    }

    //根據書名查詢
    private void queryRec() {
        String et = editBook.getText().toString();
        String args[] = new String[]{"%" + et + "%"};
        cursor = helper.query(args);
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(
                this,
                R.layout.list,
                cursor,
                new String[]{"BookName", "Author", "Publisher"},
                new int[]{R.id.textbookname, R.id.textauthor, R.id.textpublisher}
        );
        lvBook.setAdapter(adapter);
    }

    //刪除記錄
    private void deleteRec() {
        helper.delete(id);
        cursor.requery();
        lvBook.invalidateViews();
        editBook.setText("");
    }
}

三、配置文件

  打開“AndroidManifest.xml”文件。
  然後輸入以下代碼: 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yanlei.my" >

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

實際上不需要任何修改

附:

(一)如何刪除Sqlite資料庫

  常有人問:如何刪除自己創建的資料庫?

  在Activity中,提供有現成的方法:public boolean deleteDatabase (String name)  

(二)SimpleCursorAdapter簡要說明

  描述:

  SimpleCurosrAdapter 是一個將 Cursor 中的 columns 與在 XML 文件中定義的 TextViews 或 ImageViews 進行匹配的簡易 adapter。你可以指定選擇 Cursor 中的哪些 columns、用哪些 views 來顯示這些 columns 、以及指定定義這些 views 的 xml 文件。

也就是說,SimpleCursorAdapter 允許綁定一個 Cursor 的 columns 到 ListView 上,並使用自定義的 layout 顯示 List中的每個項目。

可以使用 SimpleCursorAdapter 作為中間橋梁,將從 sqlite 資料庫中查詢出來的數據直接顯示到 ListView 中。

  原型:

  public SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {

     super(context, layout, c);
      mTo = to;
      mOriginalFrom = from;
      findColumns(from);
   }

  參數:

  Context context, 這個與 SimpleListItemFactory 相關的 ListView 所處運行上下文(context)。也就是這個 ListView 所在的 Activity。

  int layout, 顯示 list item 的 佈局文件。這個 layout 文件中至少要包含在 "to" 參數中命名的 views。

  Cursor c,資料庫的游標( Cursor )。如果 cursor 無效,則該參數可以為 null

  String[] from, 指定 column 中的哪些列的數據將綁定(顯示)到 UI 中。如果 cursor 無效, 則該參數可為 null。

  int[] to, 指定用於顯示 "from" 參數指定的數據列表的 views。 這些 views 必須都是 TextViews。 "from" 參數的前 N 個值(valus)和 "to" 參數的前 N 個 views 是一一對應的關係。如果 cursor 無效,則該參數可為 null。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 標題欄和狀態欄 Android程式預設情況下是包含狀態欄和標題欄的。 在Eclipse中新建一個Android程式,運行後顯示如下: 圖中標出了狀態欄(顯示時間、電池電量、網路等)和標題欄(顯示應用的名稱,即activity的android:label的屬性值)。 要隱藏標題欄和狀態欄,總體來說有兩
  • 1、首先先創建四個動畫文件 ①:left_in.xml <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android
  • 簡介:UIPickerView是一個選擇器控制項,它比UIDatePicker更加通用,它可以生成單列的選擇器,也可生成多列的選擇器,而且開發者完全可以自定義選擇項的外觀,因此用法非常靈活。UIPickerView直接繼承了UIView,沒有繼承UIControl,因此,它不能像UIControl那樣
  • 一、問題在哪裡? textview顯示長文字時會進行自動折行,如果遇到一些特殊情況,自動折行會杯具成這個樣子: 上述特殊情況包括: 1)全形/半形符號混排(一般是數字、字母、漢字混排) 2)全形/半形標點符號出現在行首時,該標點符號會連同其前一個字元跳到下一行 3)英文單詞不能被折成兩行 4)...
  • 這段時間對視頻開發進行了一些瞭解,在這裡和大家分享一下我自己覺得學習步驟和資料,希望對那些對視頻感興趣的朋友有些幫助。 一、iOS系統自帶播放器 要瞭解iOS視頻開發,首先我們從系統自帶的播放器說起,一、我們可以直接播放視頻,看到效果,不然搞了半天還播放不了視頻,會讓大家失去興趣。二、其實對於很多需
  • 先看這段源碼介紹: /** * Called when a view created by this adapter has been detached from its window. * * <p>Becoming detached from the window is not necessar
  • 我在將以前在Eclipse中寫的項目import到android studio中後,出現了 AAPT err(Facade for 157667509): libpng error: Not a PNG file 錯誤,提示信息顯示圖片非PNG格式。 解決方法: 在studio中依次點開每個尾碼名為
  • 自己總結的功能: 添加xml中的中文到string.xml中 extract android string= Alt + Enter來調用 ----常用快捷鍵 1.Ctrl+E,可以顯示最近編輯的文件列表 2.Shift+Click可以關閉文件 3.Ctrl+[或]可以跳到大括弧的開頭結尾 4.Ct
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...