🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
SQLite

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

1048閲覧

データベースの競合による不整合

EveryoneCanEat

総合スコア40

SQLite

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2019/09/29 02:09

お世話になっております。Androidアプリ開発初心者です。

現在作成中のアプリで、sqliteのデータベースを2つ使用し、トランザクションをかけております。

初期化ボタンで、2つのデータベースの初期データを一度に投入しておりますが、

一つ目のデータベースのデータは書き込みが出来ておりますが、2つ目のデータベースのデータは、書き込みが出来ていない状況です。

初期データ投入コードは、一つ目のデータ書き込みの直ぐ後に、二つ目のデータ書き込みを行っております。二つ目のデータの量は、一つ目の2倍ぐらいです。

調べてみたところ、sqliteでトランザクションをかけてデータベースの競合を検知すると、ロールバックして、データを消去してしまう、ということですが、

どうやら、二つ目のデータベースが競合を検知して、ロールバックしてしまっているのではないか、と存じ上げます。

これを解決する為に、分離レベルにつきましても勉強いたしましたが、安全の為に、分離レベルはデフォルトのEXCLUSIVEを使用しておりますが、試しにIMMEDIATEも使ってもみましたが、全く状況が変わらない状態です。

ログキャットにエラーログが表示されれば、解決の糸口も探しようがあるのですが、ビルド自体は成功していてログを吐いてくれないので、非常に困っております。

もし、解決策につきまして、ご検討がつく方がおられましたら、ご教授の程、宜しくお願い申し上げます。

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

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

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

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

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

dodox86

2019/09/29 03:07

2つのSQLite3のデータベースって、ファイルで分けているのですよね。(1つのファイル内の2つのテーブル、ではないですよね?)それだとなおさら競合は考えづらいです。単純に、2つ目のDBへの初期データ投入の途中でデータ形式の不正などでExceptionが発生して、ロールバックしているのではないでしょうか?いずれにせよ、ソースコードを提示しないとほとんど推測での回答しかできないと思います。
EveryoneCanEat

2019/09/29 03:36

ご教授、誠にありがとうございます。 データベースはそれぞれ2つのファイルに分けておりますが、intentで一つ目から二つ目に直ぐに飛ばしてそれぞれ、データ投入しております。 「初期データの投入でデータ形式の不正」というご教授につきまして。ひょっとしたら心当たりがあるかもしれません。sqliteはデータ型を問わないので、テキストデータを入れる部分に、数字やハイフンなどを利用しておりました。 直ぐに確認します。 コードは、それでも解決しなかった場合、掲載致します。 本当にありがとうございます。
dodox86

2019/09/29 04:17

> sqliteはデータ型を問わないので、 いえ、問います。他のRDBシステムほどでは無いですが、例えばINTEGERのカラムに文字列'TEXT'などと入れると、エラーです。
EveryoneCanEat

2019/09/29 04:53

遅くなり、申し訳ありません。数字をダブルクォーテーションで囲み、文字と認識してもらえるようにして、ビルドしましたが、やはり2つ目のデータベース書き込みがされません。 sqliteはデータ型を問う、というご教授のもと、もう一度、データベーステーブル名を変えて、カラムのデータ型も修正し直して、再度やり直してみます。
EveryoneCanEat

2019/09/29 05:45

クリア出来ました!! 本当にありがとうございます!! 勘違いしておりました点と致しまして、 ・ロールバックが起こったのは、今回の場合につきましては、データ形式の不正が原因で、データベースの競合ではなかったこと ・sqliteはデータ型は問われること 本当にありがとうございます!! dodox86様にベストアンサーになって欲しかったのですが、自己解決にせざるを得ませんでしょうか…?
guest

回答1

0

自己解決

コードにつきましては、それぞれのデータベースに、普通に
begintransaction・settransactionsuccessful・endtransaction
を使用しております。

今回のエラーの原因につきまして、データベースの競合ではありませんでした。

データベーステーブル名を変えて、カラムの型を修正し、やり直したところ、エラーが解決しました。

ご教授頂きました、dodox86様、誠にありがとうございました。

今回の件のみではなく、sqliteでデータベースを使う際、過去に、テーブルと相性が合わないのか、ただ、テーブルの名前を変更するだけで動くことが多々、ありました。

今回の件につきましては、dodox86様のご教授により、データ型を正しく修正致しまして、テーブルを新しく作り直し、エラーの解決に至りました。

投稿2019/09/29 02:25

編集2019/09/29 06:11
EveryoneCanEat

総合スコア40

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

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

dodox86

2019/09/29 03:09

これは回答ではありませんので、質問自体への追記、修正で書きましょう。
EveryoneCanEat

2019/09/29 03:23

間違ってしまいました。申し訳ありませんでした。
dodox86

2019/09/29 04:19

もし、コメントへの対応で解決したら、こちらの回答を修正して自己解決すれば良いと思います。
dodox86

2019/09/29 06:22 編集

問題が解決してよかったです。直接関係ありませんが、デバッグや確認にlogcatが使えないままというのはつらいので、実機ではUSBデバッグをするとか、logcatで出力したいような内容は何らかのデバッグ用のView、例えばTextViewを画面に貼り付けて、そこへ出力するようにすれば確認できます。Exceptionが起きていれば無視せず、内容を精査しましょう。
EveryoneCanEat

2019/09/29 06:32

本当にありがとうございます。 やはり、経験者は違いますね!! 経験者は、他の人が1ヶ月かかることを、1日でやってしまう、そういうところがとても憧れます。 USB実機でのデバッグや、Textviewで値を確認したりはしておりますが、変数などの値を一つずつ確認するやり方が解りません(;_;) ブレークポイントを指定して一行ずつ実行、などのやり方が解りません、、。
dodox86

2019/09/29 07:03 編集

> 変数などの値を一つずつ確認するやり方が解りません(;_;) > ブレークポイントを指定して一行ずつ実行、などのやり方が解りません、、。 そうであれば、そこは優先度高めにして習得することをお薦めします。知っているのと知らないのとでは、デバッグの効率がぜんぜん違います。 https://developer.android.com/studio/debug?hl=ja 私の場合ですが、Androidに限らず新規でコードを書いたときは大抵、一度はデバッガーでトレース(ステップ実行)して一行一行動作確認し、想定どおりに動いているか目で確認します。あとは可能な限り単体テスト用のコードを(AndroidならJUnitを使って)書きますね。 頑張ってください。
EveryoneCanEat

2019/09/29 07:14

ご教授頂きましたのみではなく、デバッグの方法までお教え頂きまして、誠にありがとうございます。 JUnitというのは、単体のテスト用のコードだったのですね!! 今までは、私は、主に分割してビルド致しておりました。どこの部分がおかしいのか、見当をつけて、コメントアウトして、分割して、エラーの原因を探ったり、Textviewやトースト表示で値を確認したり、あとはログキャットでエラーログを読むのが一番早かったんですけど、今回のように、エラーログを吐かないケースもあるので、ご教授頂きましたデバッグ方法も習得したいと思います。 今回のエラーにつきまして、私はてっきり、データベースの競合が原因かと勘違い致しておりましたので、違う、というご指摘により、素早くエラーを解決することが出来まして、dodox86様に、本当に感謝させて頂いております。 誠にありがとうございました。
dodox86

2019/09/29 07:25

> どこの部分がおかしいのか、見当をつけて、コメントアウトして、分割して、エラーの原因を探ったり、Textviewやトースト表示で値を確認したり、あとはログキャットでエラーログを読むのが一番早かったんですけど、 (上から目線で恐縮ですが)基本的な問題解決への攻め方として正当だと思いますよ。それに加えてデバッガーは強力な得物(武器)なので、使える武器が多ければ更に強くなる、と言うことです。※プログラマーにとっては必須アイテムでしょうけど。
EveryoneCanEat

2019/09/29 07:34

本当にありがとうございます。デバッグ方法も今、勉強させて頂いております。 でも、やはり経験者にはかないません。 今回のように、想定外の部分でエラーが起きた場合、無駄な時間と労力を使わない為には、やはり経験者にご教授頂くしかない。 そして、自分自身も、1ヶ月かかることを1日でやれるようになる為には、やはり、勉強のみではなく、経験がどうしても必要なことも存じ上げております。 折れずに諦めずに不屈の精神で精進致したい次第です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問