質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.53%
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

2799閲覧

UnityでSQLiteを使用する方法

Tomo0225

総合スコア67

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/10/12 17:44

UnityでSQLiteを使用しデータベースを操作したいのですが何やら不思議な挙動をしていて思うようにいきません。SQLiteUnityKitを使用しデータベースはStreamingAssetフォルダに置いています。またGUIのSQLite操作ツールとしてPopSQLiteを使用しています。またUnity内では下記のコードでデータの削除や追加、取得を試みています。
この後は①私が行ったこと・・・その結果という形で記述していきます。
①popSQLiteでデータを追加する。
②Unity内でデータの取得をする・・・・・できる
③Unity内でデータの削除や追加をする・・・Unity内では追加したデータを取得することもでき、削除したデータは消えているのになぜかPOPSQLiteで確認するとデータベースは①の状態のまま。この時点でUnity内で参照しているデータベースとPOPSQLiteで見ることができるStreamingAssetフォルダのデータベースの内容が違うことになります。
そして更に
⑤POPSQLite内でデータベースにデータを追加するし保存する・・・・Unity内で参照できるデータがPOPSQLiteで見ているものと同じになる。③で加えた変更はなかったものになっている。
このような不思議な挙動を示し何が起こっているのか分からず困ってしまっています。
せめてどのような疑いがあるのかだけでも教えて欲しいです。よろしくお願いします。回答お待ちしてます。

SqliteDatabase sqlDB = new SqliteDatabase("character.db"); string query = "delete from status where playername = (select playername from status limit 1 offset "+rowid+"-1)"; sqlDB.ExecuteNonQuery(query);
SqliteDatabase sqlDB = new SqliteDatabase("character.db"); string query = "insert into status values('a','b',3,4,5,6,7,8); sqlDB.ExecuteNonQuery(query);
SqliteDatabase sqlDB = new SqliteDatabase("character.db"); string selectQuery = "select playername,job,str,def from status"; DataTable dataTable = sqlDB.ExecuteQuery(selectQuery);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

SQLiteUnityKitに関しては
Application.streamingAssetsPathは読み込み専用(マスタ用)に置いているだけなので、
Application.persistentDataPathにDBをコピーして読み書きを行なっており、
Unityゲーム内で使用しているDBはこちらになります。
Debug.Log(Application.persistentDataPath)で表示されるパスに
コピーされたDBがありますので、そちらをPOPSQLiteで確認してみてください。

投稿2020/10/13 09:05

編集2020/10/13 09:14
U_U_Jenkins

総合スコア110

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

U_U_Jenkins

2020/10/13 09:12

解決済みですが一応。。
Tomo0225

2020/10/13 10:41

ありがとうございます。未だ疑問だった部分が解消できました!。
guest

0

ベストアンサー

SQLiteUnityKitを使用しデータベースはStreamingAssetフォルダに置いています。

StreamingAssetsフォルダー下に配置しているということで、DBへの書き込みが不可な、読み取り専用になっているからではないでしょうか。以下の記事が参考になると思いますので、ご案内します。

Unity Android/Windows 環境における SQLite の使い方の基本 - sh1’s diary

投稿2020/10/12 18:02

dodox86

総合スコア9170

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tomo0225

2020/10/12 18:22

回答ありがとうございます。そちらのサイトは導入時に参考にさせていただいたのですが ””StreamingAssets フォルダーに DB ファイルがあっても insert も update もできません。そのため、persistentDataPath(アプリのインストール先のフォルダ)に DB ファイルをコピーする、といった手法が一般的になっているようです。 DB ファイルをコピーする操作は、SQLiteUnityKit の SqliteDatabase のコンストラクターが担当しています。(WWW クラスを利用して警告がでていた部分です)”” と書いてありますね。自分はここを読んで何もしなくてもSQLiteUnityKitでDBファイルをコピーして書き込み可能にしてくれると思ったのですが違うのかもしれませんね。
dodox86

2020/10/12 18:38

私の回答は適切ではなかったようですが、解決して良かったです。記事に対する私の読み込みも甘かったようで、失礼しました。
U_U_Jenkins

2020/10/13 07:35

ちなみにStreamingAssetに関していうと読み書き可能です。
dodox86

2020/10/13 07:43

glowingpuzzleさん、フォローの情報どうもありがとうございます。 そうだとすると、私のものは誤答にあたりますね。低評価も止む無し、です。BAを外してもらって、適切な別の正しい回答を投稿していただきたいところです。あえて現状、このままにしておきます。
fiveHundred

2020/10/13 08:13

> ちなみにStreamingAssetに関していうと読み書き可能です。 上記は(厳密には)正しくないです。 StreamingAssetsは書き込みを想定していません。 Windowsの場合ではファイルをそのままディレクトリに配置しているだけなので書き込みが可能となっていますが、他のプラットフォーム(LinuxやAndroid)では書き込み不可能となっていることもあります。 Tomo0225さんのURLの「修正2」では、StreamingAssetsのファイルを端末にコピーしてる処理の修正を行っていますので、この点でもこのことが分かる(書き込み可能なのであればそもそもこの処理は不要)と思います。
dodox86

2020/10/13 08:19

fiveHundredさん、更なるフォローの情報どうもありがとうございます。「Assets」なので、当初はAndroidアプリのように同様に書き込みを想定していない場所かと思っていたこともあり、あまり疑いなく回答してしまいました。意外や複雑な事情があるのですね。Windows10 上で以下のコードで今、動作検証してファイルを書き込めたことは確認し、回答を訂正をしようかとしていましたが、やはりこのままにしておきます。私も勉強になりました。 public class Hoge : MonoBehaviour { void Start() { string path = Application.streamingAssetsPath; string filePath = System.IO.Path.Combine(path, "test.txt"); Debug.Log($"path={filePath}"); string contents = $"dt={DateTime.Now} - dummy"; System.IO.File.WriteAllText(filePath, contents);
U_U_Jenkins

2020/10/13 08:52

あ・・・その通りです。勘違いしてました。私側で Application.streamingAssetsPathが示す部分に関して Application.persistentDataPathと置き換えて捉えていました。 基本StreamingAssetは読み込み専用にして使い、 Application.persistentDataPathに置いてあるデータをストレージとして読み書きして使うのが正解ですね。適当言ってしまい、失礼いたしました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.53%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問