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

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

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

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

Android

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

データベース

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

1回答

324閲覧

APIレベル14でdisableWriteAheadLogging()を動作させた場合の動作を教えてください

yoshida1603

総合スコア6

SQLite

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

Android

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

データベース

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2017/10/29 15:39

編集2017/10/29 16:43

Android初心者です。
勉強のために他の方が開発されたアプリのデバックを行っています。
そのアプリはAndroid4.0から対応するようになっています。

そのアプリ内でデータベースを扱っているのですが、そこでdisableWriteAheadLogging()を利用しています。
この関数はAPIレベル16から追加されたものなので、APIレベル14もしくは、15であるAndroid4.0では本来対応していませんが、@SuppressLint 'NewApi'のアノテーションを利用してエラーを回避しています。
現在、Android4.0でしか発生しないexceptionがあり、この関数が問題ではないかと考えています。
しかし、この関数をAndroid4.0で動作させたときの明確な動作が分かっておりません。

そこで質問なのですが、disableWriteAheadLogging()をAndroid4.0(APIレベル14もしくは15)で動作させた場合、どの様な動作になりますか?
できればその動作を確かめる方法と一緒に教えていただきたいです。

他の方のソースコードなので、問題のソースコードを張れない事をお許しください。
その他、必要な情報がない場合は申し訳ありません。出せる情報の場合は、追記いたします。

よろしくお願いします。

追記
exceptionはdatabase already closedの例外が出ています。

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

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

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

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

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

guest

回答1

0

アノテーション(@SuppressLint 'NewApi')によって得られる効果はLintの検査対象からの除外であり、エラーの根本的な解決ではありません。

本来であれば、メソッドを使用するかどうかのタイミングで、APIレベルを判定し処理を分岐させないといけません。

おそらくno such methodの例外が発生していると考えられます。エラーログを質問に追記してください。

投稿2017/10/29 16:01

yona

総合スコア18155

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

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

yoshida1603

2017/10/29 16:42 編集

深夜にかかわらず早速の回答ありがとうございます。 no such methodの例外ではなくdatabase already closedの例外が出ています。 現在Logcatをそのまま張り付けることができず申し訳ありません。 プログラムは並列で3スレッド動作していて、各動作は下記の通りです。 メインスレッド 1.サブスレッド1をサービスで利用して呼び出す 2.サブスレッド2をAsyncTaskで呼び出す 3.サブスレッド2から受け取ったデータを表示する サブスレッド1 1.DBのインスタンスを取得する 2.端末内部を参照してDBを更新する。 3.外部DBと同期してDBを更新する。 ※ここの2と3の間で問題の関数を呼んでます。 サブスレッド2 1.DBのインスタンスを取得する(サブスレッド1と同じDB) 2.DBからCursorにデータを取得する 3.メインスレッドにCursorを渡す サブスレッド2が開始してから、メインスレッドで取得したデータを表示するまでの間に、サブスレッド1の動作が終了した場合、表示のためにメインスレッドでCursorを参照した際にexceptionとなります。 なお、DBは明確にDB.closeしてません。 どうしてこのようなつくりになっているかや、どうしてアノテーションでとりあえず回避していて根本的に解決していないかは、わかりません。申し訳ありません。 分かりずかいかもしれませんが、宜しくお願い致します。
KSwordOfHaste

2017/10/29 17:49

横から失礼します。 yonaさんがおっしゃっていることの要点はAPIレベル16で追加されたメソッドを、それ未満のAPIレベルの端末では「決して呼び出してはならない」という点だと思います。API16未満の端末内部にあるランタイムにそのメソッドが存在していないのですよね? まずは、このメソッドを呼び出している箇所を通過しているか否かを調べてはいかがでしょう? 今ある手がかりがAPIレベルの問題だけならその影響有無の確認は「呼び出しているかどうかを直接確認すること」であって「例外の内容から影響有無を推測することではない」と思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問