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

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

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

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

Android

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

Q&A

2回答

3323閲覧

アンドロイド開発 2つのアプリを同じSqliteのCRUDするときのエラー!助けて〜

Newmanlee

総合スコア12

SQLite

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

Android

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

0グッド

0クリップ

投稿2016/05/11 10:05

こんにちわ、アンドロイド開発をやっているものですが、
今開発中のアプリは難題とあってて、解決に至らなくて困っています。。。

機能の要件は大体
アンドロイドのAPPがタブレット端末内のSqliteDBをinsertする処理、Deleteする処理が行われた時の問題でした。
システム構成上は
Aアプリは高い頻度でMMMテーブルにinsertしていました、
その後、
Bアプリのほうでボタンを押して、MMMテーブルのデータをDeleteする<ー★
※このDeleteする時に異常が出ました。

Exceptionメッセージは以下です〜↓↓↓
android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14)
at android.database.sqlite.SQLiteConnection.nativeExecuteForChangedRowCount(Native Method)
at android.database.sqlite.SQLiteConnection.executeForChangedRowCount(SQLiteConnection.java:734)
at android.database.sqlite.SQLiteSession.executeForChangedRowCount(SQLiteSession.java:754)
at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:64)
at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1674)
at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1603)
at com.tre.pacer.autoupdatenew.database.DBManager.ExecSQL(DBManager.java:65)
at com.tre.pacer.autoupdate.dataupload.UploadDataUtils.clearUploadLocalData(UploadDataUtils.java:220)
at com.tre.pacer.autoupdate.dataupload.DBdataUpload.dataUpload(DBdataUpload.java:194)
at com.tre.pacer.autoupdate.dataupload.DBdataUpload$2.run(DBdataUpload.java:77)
at java.lang.Thread.run(Thread.java:841)

※補足情報としては
AシステムはHybirdアプリで、html+jsで操作データをWebviewの内製jsAPIを通じて、Sqliteに書き込むものです。
BシステムはSqliteデータをサーバー側に吸い上げて更新する処理で、実行する時点でテーブルのデータを取得し、csvを生成し、サーバーにアップロードします。その後、SqliteDBの該当テーブルMMMを削除する。

Aシステムを操作する時に、もし速い操作をしてから、すぐBシステムを実行する時に、よく上のエラーが出ます。

なんかSqliteを取り扱う時の相互的な影響だったかな?

達人の方々、助けてください。

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

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

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

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

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

guest

回答2

0

2つのアプリは同一アプリですか?それとも違うアプリですか?
Androidで使用するSQLiteDatabaseはマルチスレッドには対応していますがマルチプロセスには対応していないはずです。

投稿2016/05/11 14:24

dekaaki

総合スコア292

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

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

Newmanlee

2016/05/11 14:26

違うアプリです。違うアプリが同じsqliteDBの同じテーブルにinsertとdeleteを行うロジックを組んでいる。
dekaaki

2016/05/11 23:02

そうなると単純な仕組みだけでは無理なのではと思います。 私もマルチプロセスで使用できるようにしましたが独自にプロセス間で直列処理が行えるようにして対応しました。 ただ、マルチプロセスでもSQLiteDatabaseの機能だけで安全に操作できる方法もあるかもしれませんので(私の情報が誤ってる可能性もあるので)注意してください。
dekaaki

2016/05/11 23:11

また、私は採用しませんでしたがContentProviderを使用すればプロセス間の処理ができますのでその辺りも調べたほうがいいかもしれません
guest

0

Sqliteはdbファイル全体にロックをかけるのでinsertでトランザクションを使っている場合は削除できないと思いますよ。

また、SqliteはA、Bのどちらからもアクセスできるパスに保存されていますか?

ログはコードと同じ記述方法にしたほうがいいですよ。

投稿2016/05/11 10:18

yona

総合スコア18155

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

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

Newmanlee

2016/05/11 10:24

>SqliteはA、Bのどちらからもアクセスできるパスに保存されていますか? ↑ はい、どちらでもアクセスできるパスにしています。毎回エラーが発生するわけではなくて、Aシステムでinsertを起こす操作が頻度高くする場合は、操作後にはBアプリをすぐ実行すると、エラーが出る っていう現象です。
Newmanlee

2016/05/11 10:26

>Sqliteはdbファイル全体にロックをかけるのでinsertでトランザクションを使っている場合は削除できないと思いますよ。 ↑ 順番としては、insertは先に実行してて、DBをopenし、実行、Closeする; もしかして、多くのinsertでキューに並んでいて、最後のinsertまでは終わらない時に、 Bアプリのほうはdeleteをかけはじめるっていう理解ですかな。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問