安卓開發:資料庫操作(詳細)

来源:https://www.cnblogs.com/xuyiqing/archive/2018/04/17/8868681.html
-Advertisement-
Play Games

安卓使用的資料庫是sqlite 創建方式:新建一個類繼承SQLiteOpenHelper 這裡第二個參數:資料庫的名字,第三個參數為結果集(游標)寫成null即可,最後一個參數為資料庫的版本,寫1即可 在MainActivity中新建實例即可創建資料庫: 好的,運行即可創建資料庫成功 接下來看下My ...


安卓使用的資料庫是sqlite

創建方式:新建一個類繼承SQLiteOpenHelper

package org.dreamtech.sqlite;

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

public class MyOpenHelper extends SQLiteOpenHelper {

    public MyOpenHelper(Context context) {
        super(context, "dreamtech.db", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {    
    }

}

這裡第二個參數:資料庫的名字,第三個參數為結果集(游標)寫成null即可,最後一個參數為資料庫的版本,寫1即可

 

在MainActivity中新建實例即可創建資料庫:

package org.dreamtech.sqlite;

import android.os.Bundle;
import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MyOpenHelper myOpenHelper = new MyOpenHelper(getApplicationContext());
        // 獲取一個可寫的資料庫,如果資料庫不存在,則新建資料庫
        SQLiteDatabase sqLiteDatabase = myOpenHelper.getWritableDatabase();
    }

}

 

好的,運行即可創建資料庫成功

 

 

接下來看下MyOpenHelper中的方法:

oncreate:資料庫第一次創建時候執行的方法

適合於初始化表結構

示例:

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table info(_id integer primary key autoincrement,name varchar(20))");
    }

 

另一個方法:onupgrade方法:

當資料庫版本升級的時候調用(上邊設置為1版本,如果升級成2,會運行這裡的方法)

示例:這裡可以修改表結構

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("alter table info add tel varchar(20)");
    }

 

註意:版本只能升,不能降級

 

接下來做一個增刪改查的小案例:

使用原始方法:

package org.dreamtech.sqlite;

import android.os.Bundle;
import android.view.View;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class MainActivity extends Activity {

    private MyOpenHelper myOpenHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myOpenHelper = new MyOpenHelper(getApplicationContext());
    }

    //
    public void click1(View v) {
        SQLiteDatabase db = myOpenHelper.getWritableDatabase();
        db.execSQL("insert into info(name,tel) values(?,?)", new Object[] {
                "zhangsan", "110" });
        db.close();
    }

    //
    public void click2(View v) {
        SQLiteDatabase db = myOpenHelper.getWritableDatabase();
        db.execSQL("delete from info where name=?", new Object[] { "zhangsan" });
        db.close();
    }

    //
    public void click3(View v) {
        SQLiteDatabase db = myOpenHelper.getWritableDatabase();
        db.execSQL("update info set tel=? where name=?", new Object[] { "120",
                "zhangsan" });
        db.close();
    }

    //
    public void click4(View v) {
        SQLiteDatabase db = myOpenHelper.getWritableDatabase();
        Cursor cursor = db.rawQuery("select * from info", null);
        if (cursor != null && cursor.getCount() > 0) {
            while (cursor.moveToNext()) {
                String name = cursor.getString(1);
                String tel = cursor.getString(2);
                System.out.println(name + "   " + tel);
            }
        }
        db.close();
    }
}

 

確實成功了,但是存在問題:sql語句只要一處出錯,將難以發現,浪費大量時間

唯一的優點:多表查詢

 

通常操作資料庫是採用谷歌封裝好的API:

 優點:不易寫錯,有返回值,方便開發

 缺點:涉及多表操作不便

package org.dreamtech.sqlite;

import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class MainActivity extends Activity {

    private MyOpenHelper myOpenHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myOpenHelper = new MyOpenHelper(getApplicationContext());
    }

    //
    public void click1(View v) {
        SQLiteDatabase db = myOpenHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("name", "zhangsan");
        values.put("tel", "110");
        // 返回新行的id
        long insert = db.insert("info", null, values);
        db.close();
        if (insert > 0) {
            Toast.makeText(getApplicationContext(), "add 成功", Toast.LENGTH_LONG)
                    .show();
        } else {
            Toast.makeText(getApplicationContext(), "add 失敗", Toast.LENGTH_LONG)
                    .show();
        }
    }

    //
    public void click2(View v) {
        SQLiteDatabase db = myOpenHelper.getWritableDatabase();
        // 返回值:影響的行數
        int delete = db.delete("info", "name=?", new String[] { "zhangsan" });
        db.close();
        Toast.makeText(getApplicationContext(), "刪除了" + delete + "行",
                Toast.LENGTH_LONG).show();
    }

    //
    public void click3(View v) {
        SQLiteDatabase db = myOpenHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("tel", "666");
        // 返回值:更新了多少行
        int update = db.update("info", values, "name=?",
                new String[] { "zhangsan" });
        db.close();
        Toast.makeText(getApplicationContext(), "更新了" + update + "行",
                Toast.LENGTH_LONG).show();
    }

    //
    public void click4(View v) {
        SQLiteDatabase db = myOpenHelper.getWritableDatabase();

        Cursor cursor = db.query("info", new String[] { "tel" }, "name=?",
                new String[] { "zhangsan" }, null, null, null);

        if (cursor != null && cursor.getCount() > 0) {
            while (cursor.moveToNext()) {
                String tel = cursor.getString(0);
                System.out.println(tel);
            }
        }
        db.close();
    }
}

 

 

事務操作:執行一段邏輯,要麼同時成功,要麼同時失敗

這裡寫一個邏輯轉賬的案例

 

package org.dreamtech.transaction;

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

public class MyOpenHelper extends SQLiteOpenHelper {

    public MyOpenHelper(Context context) {
        super(context, "Account.db", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table info(_id integer primary key autoincrement,name varchar(20),money varchar(20))");
        db.execSQL("insert into info('name','money') values('a','2000')");
        db.execSQL("insert into info('name','money') values('b','5000')");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }

}

 

package org.dreamtech.transaction;

import android.os.Bundle;
import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {

    private MyOpenHelper myOpenHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myOpenHelper = new MyOpenHelper(getApplicationContext());
    }

    // 使用事務進行轉賬
    public void click(View v) {
        SQLiteDatabase db = myOpenHelper.getReadableDatabase();

        // 開啟事務
        db.beginTransaction();
        try {
            // 轉賬邏輯
            db.execSQL("update info set money=money-100 where name=?",
                    new Object[] { "a" });
            // 加入這一行則不會成功
            // int a = 10/0;
            db.execSQL("update info set money=money+100 where name=?",
                    new Object[] { "b" });
            // 表示當前事務成功(自動提交)
            db.setTransactionSuccessful();
        } catch (Exception e) {
            Toast.makeText(getApplicationContext(), "轉賬失敗", Toast.LENGTH_LONG)
                    .show();
        } finally {
            // 關閉事務
            db.endTransaction();
        }

    }
}

 

加入10/0一行的效果:


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

-Advertisement-
Play Games
更多相關文章
  • 通常從伺服器端獲取的圖片是URL地址,如果簡單地通過URL地址獲取圖片? 有一個開源項目:SmartImageView,做到了這個功能,同時還有其他功能,下載不便,過於龐大 這裡自己實現它的這個簡單功能 代碼: 兩個重載方法: 1:明確URL地址正確、不會失誤,直接調用 2:防止圖片URL出錯,設置 ...
  • 第一種: 用CADisplayLink可以實現不停重繪。 - (CADisplayLink *)link { if (!_link) { // 創建定時器,一秒鐘調用rotation方法60次 _link = [CADisplayLink displayLinkWithTarget:self sel ...
  • 效果圖如下: 二級列表附有點擊事件。 1、佈局文件: 此處加了一個自定義的導航RelativeLayout,記得註activity的時候添加 android:theme="@style/Theme.AppCompat.Light.NoActionBar" 去掉自帶的導航。 2、一級列表佈局: 3、二 ...
  • 參考高通文檔: 80 NL239 4_F_PMIC_SW_Driver_Overview_MSM8916.pdf DTS文檔: android\kernel\Documentation\devicetree\bindings\batterydata\batterydata.txt 項目數據節點需要的 ...
  • 在網上看到幾篇不錯的博客,分享和學習一下! Android使用WebView載入網頁 https://blog.csdn.net/tuke_tuke/article/details/51684254 教你怎麼配置Android的AndroidManifest.xml讓你不用重覆新建項目 https: ...
  • 開發文檔 官方開發文檔 開發IDE 官方工具下載 UI組件 WeUI:是一套同微信原生視覺體驗一致的基礎樣式庫,由微信官方設計團隊為微信內網頁和微信小程式量身設計; ZanUI-WeApp:是有贊移動 Web UI 規範 ZanUI 的小程式現實版本,結合了微信的視覺規範 MinUI:是基於微信小程 ...
  • 需要:pod 'YYKit' 在block語句塊中,如果需引用self,而self對象中又持有block對象,就會造成迴圈引用迴圈引用(retain cycle),導致記憶體泄露,比如以下代碼 一般我們是這麼解決的,使用一個__weal修飾的weakSelf變數指向self對象,在block中使用we ...
  • 使用最廣泛的解析XML文檔的方法有兩種,一種基於SAX,另一種基於DOM。SAX解析器是事件驅動型的,在解析時增量地讀取XML文檔,當解析器識別出一個結點的時候會調用相應的委托方法。 參考資料《iOS編程指南》 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...