スキップしてメイン コンテンツに移動

Xamarin.FormsのSQLiteのテストアプリ

Xamarin.Formsで使えるSQliteのモジュール、なかなか使えそうでちょっと試してみた
とは言え、コードは
こちらのサイトからパクった物

割とあっさり成功

Createもクラスのメンバを元に勝手に作ってくれて、InsertやSelectも問題無さそう
ちなみにBeginTransaction,Commit,RollbackもInsertの時に試したらうまく動いてくれた

上記のサイトのButton2_clickedを

// Insert
private void Button2_Clicked(object sender, EventArgs e)
{   // データ追加
    using (var db = new SQLite.SQLiteConnection(DbPath))
    {   // Insert
        db.BeginTransaction();
        db.Insert(new Tran() { Name = "Tran 12 Name", TimeStamp = DateTime.Now, Value = 1.1m });
        db.Insert(new Tran() { Name = "Tran 23 Name", TimeStamp = DateTime.Now, Value = 2.2m });
        db.Insert(new Tran() { Name = "Tran 34 Name", TimeStamp = DateTime.Now, Value = 3.3m });
        db.Insert(new Tran() { Name = "Tran 45 Name", TimeStamp = DateTime.Now, Value = 4.4m });
        db.Commit();
    }
}


みたいな感じに書き換えてテストしただけだけど

んじゃあ、元からあるクラスを継承して作ったクラスはどんなテーブルが作られるのか
と言うわけで、

/// <summary>
/// Tranを継承しただけのクラス
/// </summary>
public class Tran2 : Tran
{
    public string date2 { get; set; }
    public int name2 { get; set; }
}

と言うクラスと言う構造のテーブルをCreateしたら、カラム名はどのように並ぶのだろう
と試したところ、

継承したクラスのメンバが、先に来るんですな・・・

まじか・・
てことは継承元は後ろの方に行ってしまうのかぁ
今考えている脳内設計をちょっと変えないといけない

元からあるクラスをちょいと継承してテーブルに仕立てようと思ったんだけど
むーん・・・・
まあ、こういう動きをするって事がわかったんだったら、継承した方が先になって作られる前提で設計すればいいわけなので、まあ進めるとしますか

何かやるときはやっぱりこういう単機能のアプリを作って試すのは大切だね

ちなみに、全ソースはこの下
真似する人はパクリ元のサイトはちゃんと読んでね
nugetで取り込むパッケージとか書いてあるから

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;

namespace TestSqlite
{
    public class Tran
    {
        [SQLite.PrimaryKey, SQLite.AutoIncrement]
        public int Id { get; set; }
        public string Name { get; set; }
        public DateTime TimeStamp { get; set; }
        public decimal Value { get; set; }
    }

    /// <summary>
    /// Tranを継承しただけのクラス
    /// </summary>
    public class Tran2 : Tran
    {
        public string date2 { get; set; }
        public int name2 { get; set; }
    }

    public partial class MainPage : ContentPage
    {
        public static string DbPath { get; } = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "SQLiteDataBase.db");
        public MainPage()
        {
            InitializeComponent();
            var sl = (StackLayout)(this.Content = new StackLayout());
            var button1 = new Button() { Text = "Create Table" };
            var button2 = new Button() { Text = "Insert" };
            var button3 = new Button() { Text = "Select" };
            var button4 = new Button() { Text = "Query" };
            var button5 = new Button() { Text = "Create2" };

            sl.Children.Add(button1);
            sl.Children.Add(button2);
            sl.Children.Add(button3);
            sl.Children.Add(button4);
            sl.Children.Add(button5);

            button1.Clicked += Button1_Clicked;
            button2.Clicked += Button2_Clicked;
            button3.Clicked += Button3_Clicked;
            button4.Clicked += Button4_Clicked;
            button5.Clicked += Button5_Clicked;
        }

        private void Button5_Clicked(object sender, EventArgs e)
        {
            // データベース初期設定
            using (var db = new SQLite.SQLiteConnection(DbPath))
            {   // Create Table
                db.CreateTable<Tran2>();
            }
        }

        // Query
        private void Button4_Clicked(object sender, EventArgs e)
        {   // データ取得
            using (var db = new SQLite.SQLiteConnection(DbPath))
            {   // Select
                foreach (var row in db.Query<Tran>("Select * From Tran Where Name like ? ", $"%3%"))
                    Console.WriteLine($"Tran: {row.Id}, {row.Name}, {row.TimeStamp}, {row.Value}");
            }
        }

        // Select
        private void Button3_Clicked(object sender, EventArgs e)
        {   // データ取得
            using (var db = new SQLite.SQLiteConnection(DbPath))
            {   // Select
                foreach (var row in db.Table<Tran>().Where(r => r.Name.Contains("3")))
                    Console.WriteLine($"Tran: {row.Id}, {row.Name}, {row.TimeStamp}, {row.Value}");
            }
        }

        // Insert
        private void Button2_Clicked(object sender, EventArgs e)
        {   // データ追加
            using (var db = new SQLite.SQLiteConnection(DbPath))
            {   // Insert
                db.BeginTransaction();
                db.Insert(new Tran() { Name = "Tran 12 Name", TimeStamp = DateTime.Now, Value = 1.1m });
                db.Insert(new Tran() { Name = "Tran 23 Name", TimeStamp = DateTime.Now, Value = 2.2m });
                db.Insert(new Tran() { Name = "Tran 34 Name", TimeStamp = DateTime.Now, Value = 3.3m });
                db.Insert(new Tran() { Name = "Tran 45 Name", TimeStamp = DateTime.Now, Value = 4.4m });
                db.Commit();
            }
        }

        // Create Table
        private void Button1_Clicked(object sender, EventArgs e)
        {   // データベース初期設定
            using (var db = new SQLite.SQLiteConnection(DbPath))
            {   // Create Table
                db.CreateTable<Tran>();
            }
        }

    }
}

コメント

このブログの人気の投稿

RAM DISKを使ってみた(使ったのはImDisk)

GWだし、まあちょっとラムディスクを入れてみました うちのPCはWindows11 使ったのはImDiskというRAM Disk。 まあ、この辺のインストールとかはあちこちで解説してる人がいるので適当にぐぐってくださいな で、とりあえずベンチマーク なかなかいいスピードだ で、大抵の人はブラウザのキャッシュをRAMディスクにするといいよ・・・と言うけど そもそもメインドライブがNVMeのSSDを使っている状態で、体感速度なんか上がらない(使い終わったキャッシュを再起動したら綺麗さっぱり捨て去ってくれるという利点はある)  うちで一番効果があるのは Adobe Audition というアプリ これが結構高速化する(キャッシュをちゃんとRAMディスクにしたら・・・だけど) ハイレゾ音源だと、1時間の音源が何かする度に4GBのファイルを作られてしまう なので、RAM DISKにすると、結構編集時間を短縮できる Premiere Rushも出力先をRam Diskにしておいて終わったら、SSDにコピーすると言う事をやるとかなりスピードアップになる 実はうちのPCは普段は99%のパワーで動作していて、CPUのターボブーストが掛からないようになっている 大体3.6GHz当たりで安定してるのだけど、これを100%にするとターボブースト機能がONになって一部のコアが4.5とか4.8GHzまで上がる まあ、毎回電源オプションをいじる事になるのだけどさ・・・ そうしてベンチを取ると こんな感じ とは言え、ブーストしてるからと行ってRam Diskのスピードの差を体感する事はさすがに無理 ・・・と言うかフォトショでもRAM DISKにしてよかった・・・と言うほど変わらない SSDの性能が上がってきたしもし次にPCを買い換えたらRAM DISKよりSSDの方が速いかもね  

.NET MAUI BLE(Bluetooth Low Energy)も上手く行った

2023/10/11更新 ↓こちらの記事で更新しれました。 .NET MAUI PLUGIN BLEがWindows(10/11)に対応してた Windows対応 イヤッッホォォォオオォオウ Bluetooth LE plugin for Xamarin &amp; MAUI がWindowsに対応してた~ nugetでver3.00をみんな早速ゲットだ。   ちなみにこちらはAndroid版のサンプルアプリ   GitHub...   [ブログカード風リンクタグ作成] ------------------------------------------------------------------------------ 昔、スマホとESP32の接続確認用に作ったプログラムをXamarinからMAUIに移植したら動いちゃった   まあ、ESP32からスマホへの一方通行なアプリなんだけど 面倒くさいので github に公開した 下手くそなコード書きやがってとか思われそう 「間違ってるぞこのやろう」というのを見つけたら教えてくれると嬉しいです 要素技術の調査はこれで完了かな

.NET MAUIでスプラッシュスクリーン Android12で地獄を見る

まずは起動するところから・・・・  スプラッシュスクリーンだぬ マイクロソフトのサイト 見てると簡単そう(実際簡単で細かい事を気にしなければsvgファイルを用意して1行だけ書き換えておしまい)   なんかプロジェクトファイルに自動で記述されるらしい よし、プロジェクト作った                     つーか、もうスプラッシュがあるんだけど・・・・ そして自作のsvgファイル くうっ・・・デザインセンスない・・・・   それはともかく、このSVGファイルを Resources\Images にドラッグ&ドラッグ プロジェクトを右クリックして「プロジェクトファイルの編集」 して、編集できるようになったプロジェクトファイルを 自分のプロジェクトファイルに書き換える <MauiSplashScreen Include="Resources\Splash\splash.svg" Color="#512BD4" BaseSize="168,168" /> ↓ <MauiSplashScreen Include="Resources\Splash\ splashtestmaui .svg" Color="#512BD4" BaseSize="168,168" />   とりあえずAndroidで実行 お、おう・・・・ まあ最初はこんなもんよね 最初に紹介したマイクロソフトのサイトでもBaseSizeを書き換えてくださいって言ってるし 言われたとおりに <MauiSplashScreen Include="Resources\Splash\splashtestmaui.svg" Color="#512BD4" BaseSize=" 320,600 " /> 書き換えてみると いい感じじゃーん じゃあアンドロイドのバージョン毎に試してみよう   Android 7 Android 11 Android 12 Android 13