• 締切済み

SQLiteは明示的に閉じる

いつもお世話になっております。 androidアプリの開発を行っています。 まだまだ勉強不足なのですが、ご教示お願いいたします。 下記のようにSQLiteでデータの操作をしています。 activityは詳細画面のような感じで、違うnameで複数アクセスされます。 close()を実行すると、closeしていません。みたいなエラーがでて、 close()を実行しないと、selete()が実行できなくなってしまいます。 activity.java ------------------------------ SQLiteHelper dbHelper = new SQLiteHelper(getApplicationContext()); SQLiteDatabase db = dbHelper.getWritableDatabase(); dbHelper.select(db); database.java ------------------------------ public class DatabaseHelper extends SQLiteOpenHelper { public SQLiteHelper(Context context) { super(context, DATABASE_NAME, null, 1); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE " + TABLE_NAME + " (_id integer primary key autoincrement, name text not null)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); onCreate(db); } public select(SQLiteDatabase db, String name) { String sql = "SELECT * FROM " + TABLE_NAME + " WHERE name=" + name; Cursor cursor = db.rawQuery(sql, null); // ↓これが原因かと。 db.close(); } } closeは明示的に書かないといけないのでしょうか。 分かりずらいかもしれませんが、エラーを出さない方法をご教示お願いいたします。 よろしくお願いいたします。

  • Java
  • 回答数1
  • ありがとう数0

みんなの回答

noname#147388
noname#147388
回答No.1

ログがよめないけど、 エラーログの内容を理解してその対応をする。 以上

関連するQ&A

  • AndroidにおけるSQLiteの使い方について

    Android Studioで、Androidのアプリを開発しています。 SQLiteを使おうとすると、 クエリを送るタイミングでアプリケーションが停止してしまいます。 何が悪いんでしょうか。 以下の様なソースコードで停止しました。 #MyDbOpenHelper.java package com.example.test10; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; /** * Created by taiki on 13/06/16. */ public class MyDbOpenHelper extends SQLiteOpenHelper { private static final int DATABASE_VERSION = 2; private static final String DATABASE_NAME = "board"; private static final String THREAD_TABLE_NAME = "thread"; private static final String THREAD_TABLE_COLUMN1 = "column1"; private static final String THREAD_TABLE_CREATE = "CREATE TABLE " + THREAD_TABLE_NAME + " (" + THREAD_TABLE_COLUMN1 + " text;"; MyDbOpenHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(THREAD_TABLE_CREATE); } @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i2) { } } #MainActivity.java package com.example.test10; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MyDbOpenHelper dbHelper; dbHelper = new MyDbOpenHelper(MainActivity.this); SQLiteDatabase db = dbHelper.getReadableDatabase(); db.execSQL("CREATE TABLE thread (threadNumber integer primary key autoincrement,mainText TEXT, createDate date);"); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }

  • SQLite 生のクエリ

    質問させて頂きます。お願いします。 Cursor cursor = db.rawQuery(sql.toString(), null); 「rawQuery( )」ですが調べて引数にSQL文を入れるものだという事と生のクエリを実行する物だという事はわかったのですが 生のクエリである事に意味はあるのでしょうか? また生のクエリとは何ですか? http://docs.djangoproject.jp/en/latest/topics/db/sql.html

  • FLEXプログラミングについて

    こんばんわ。 FLEX(AIR)のプログラミングをしていてどうしても解決できない謎があるのでお分かりの方がいらっしゃいましたら、教えていただければと思います。 下記はSqliteを使用するためのサンプルスクリプトの一部で、 謎だと思っている部分は※1※2の部分です。 createTable()を呼び出した場合、 ※1であれば正常に動作 ※2であれば下記エラーが発生 ArgumentError: Error #1063: Argument count mismatch on sqliteSample/onCreate1(). Expected 0, got 1. ※12ともにvoidの関数を指定しているだけであって、なんら変わりがないと思うのですが、なぜこのような現象が起こるのでしょうか? 必要部分の抜粋 ====================================== private function createTable():void { execSQL( "CREATE TABLE meibo(id INTEGER PRIMARY KEY,name TEXT,mail TEXT)", ※1)function() :void{Alert.show("テーブルmeiboを作成しました"); } ※2)onCreate1 ); } function onCreate1():void { } private function execSQL(sql:String, closure:Function):void { if (!conn.connected) return; trace("sql=" + sql); //SQL文を実行するためにSQLStatementオブジェクトを作成する stmt = new SQLStatement(); stmt.sqlConnection = conn; stmt.addEventListener(SQLEvent.RESULT, closure); stmt.addEventListener(SQLErrorEvent.ERROR, onDBError); stmt.text = sql; stmt.execute(); } ======================================

    • ベストアンサー
    • Flash
  • BCBでSQLite

    下記のサイトを参考にさせて頂き、BCB5を使用してSQLite3を操作しようと格闘中です。 自分のレベル的には初心者を脱しようかといったところだと思います。 http://members.jcom.home.ne.jp/komina/wiki/4243422F53514C69746533A4F2BBEEA4B9.html TEdit1一つに郵便番号7桁を入力して、Button1クリックで該当する住所を検索してMemo1に表示するものですが、コンパイルエラーになってしまい対処法がわかりません。 ちなみにそこで紹介されている、ライブラリをリンクするのが上手くいきませんで sqlite3.cをプロジェクトに追加してメイクしました。 また、文字コードをUTF-8に変換するというのが別サイトにも書かれていました エラー内容は、 E2034 'int(*(_closure))(void *,int,char**,char**))(void*,int char**,char**)'型は'int(*)(void*,int,char**,char**)'型に変換できない。 E2342 パラメータ'callback'はint(*)(void*,int,char**,char**)型として定義されているのでvoidは渡せない 以下、ソース抜粋です。宜しくご教授お願いいたします。 int TFmMain::callback(void* arg,int argc,char** argv,char** column){ AnsiString addr1=argv[0]; AnsiString addr2=argv[1]; AnsiString addr3=argv[2]; add_message(addr1+addr2+addr3); return SQLITE_OK; } void __fastcall TFmMain::Button1Click(TObject *Sender) { sqlite3* db; if(sqlite3_open("DBTEST1.db",&db)==SQLITE_OK){ add_message("DB open"); int rtn; char* sql; sql=sqlite3_mprintf("SELECT ADDR1,ADDR2,ADDR3 FROM ZIP WHERE ZIP=%d" ,StrToInt(Edit1->Text)); add_message(sql); rtn=sqlite3_exec(db,sql,callback,NULL,NULL); <<< ここでエラー発生!! if(rtn!=SQLITE_OK){ add_message("COMMAND err"); } sqlite3_free(sql); sqlite3_close(db); add_message("DB close"); }else{ add_message("DB open err"); } }

  • mysqlへの接続が出来ません

    まずは、サンプルプログラミングをコピーして実行してみましたが、上手くいきません。 package Connection; import java.sql.*; public class DBtest { public static void main(String[] args) { //java.sql Connection con = null; Statement stmt = null; ResultSet rs = null; String sqlStr; try { //ドライバクラスをロードする Class.forName("org.gjt.mm.mysql.Driver"); //MySQLに接続 con = DriverManager.getConnection("jdbc:mysql://localhost/dbname", "8080", "password"); //ステートメント生成 stmt = con.createStatement(); //SQL文 sqlStr = "SELECT * FROM TABLE"; //SQL文実行 rs = stmt.executeQuery(sqlStr); //検索結果数だけループ while(rs.next()){ //レコードの値 int id = rs.getInt("ID"); String name = rs.getString("NAME"); //表示 System.out.println(id + ":" + name); } //クローズ rs.close(); stmt.close(); con.close(); } catch (Exception ex) { try { //クローズ if (rs != null) rs.close(); if (stmt != null) stmt.close(); if (con != null) con.close(); } catch (Exception e) { } //エラー ex.printStackTrace(); } } } 上記はEclipseでは文法エラーはありません。で実行してみると java.sql.SQLException: Access denied for user '8080'@'localhost' (using password: YES)になります。 サンプルにはDbname、ID,Passとあるので実際のDbnameとパスワードを入れているのですが駄目です。 IDは意味が良くわからないので8080を入れてみました。 どなたか教えて下さい。お願いします。 尚、当方全くの初心者です宜しくお願い致します。

    • ベストアンサー
    • Java
  • Windows10のpythonからPostgre

    バージョンPython2.7.11、バージョンPostgreSQL9.6でPATHも通しています。下記のコードをtest105.py で保存しています import psycopg2 if name == "main": connector = psycopg2.connect(host="localhost",database="pdb",user="pgusr",password="pgpsw") cursor = connector.cursor() sql = "insert into test_table values('1','python')" cursor.execute(sql) sql = "insert into test_table values('2','パイソン')" cursor.execute(sql) sql = "insert into test_table values('3','ぱいそん')" cursor.execute(sql) connector.commit() cursor.close() connector.close() コマンドを実行するとエラーが返ります Traceback (most recent call last): File "test105.py", line 7, in <module> connector = psycopg2.connect(host="localhost",database="pdb",user="psycopg",password="pgpsw") File "C:\Python27\lib\site-packages\psycopg2\__init__.py", line 164, in connect conn = _connect(dsn, connection_factory=connection_factory, async=async) psycopg2.OperationalError: FATAL: password authentication failed for user "psycopg" コマンドプロンプトで "netstat -anp tcp" を実行し、ローカルアドレスが "0.0.0.0:5432" で状態が "LISTENING" になっております。 何が原因ですか?ご存知の方お教えください

  • アンドロイド JAVA 警告

    アンドロイド 初心者です package com.example.test; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.View; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new testView(this)); } class testView extends View { public testView(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { Paint paint = new Paint(); paint.setColor(Color.RED); canvas.drawLine(0, 0, 100, 50, paint); } } } このプラグラムで"Paint paint = new Paint();"のところで "Avoid object allocations during draw/layout operations (preallocate and reuse instead)" の警告が出ます、これを取る方法はありませんか。

    • ベストアンサー
    • Java
  • sqliteへのデータ追加

    sql文で質問です。接続は1-29の表示を確認済み。 掲示板を作る練習をしているのですが、とりあえずpostなどのユーザーから受け取り値をdbに保存・表示する前に、自分で保存(カラムは左から順にid,name,sexになっていてidの1~29は埋まっている状態です。)・表示してみようと思いtest.dbのhumanテーブルに「データの追加」と表記している部分をテーブルに書き込み表示したいのですが、エラーは表示されないもののid30番にデータの追加ができておらず困っています。 データを追加する方法を教えてください。 <?php // 変数の初期化 $db = null; $sql = null; $res = null; $row = null; $db = new SQLite3("test.db"); // データの追加 $sql = 'INSERT INTO human( id, name, sex, ) VALUES ( 30, "吉川", "男", )'; // データの取得 $sql = 'SELECT * FROM human WHERE id BETWEEN 1 AND 50;'; $res = $db->query($sql); while( $row = $res->fetchArray() ) { echo '<ul>'.'<li>'. $row[0] . $row[1] .$row[2].'<li>'.'<ul>';} ?>

  • BCBでSQLite操作

    下記のサイトを参考にさせて頂き、BCB5からSQLite3を操作しようと格闘中です。 http://members.jcom.home.ne.jp/komina/wiki/4243422F53514C69746533A4F2BBEEA4B9.html TEdit1に郵便番号7桁を入力して、Button1クリックでMemo1に該当住所等を表示するものですが コンパイルエラーが発生して対処法がわかりません。ご教授お願いいたします。 ちなみに、そこで紹介されているライブラリのリンクが上手くいかないので sqlite3.cをプロジェクトに追加してメイクしております。 また、別のサイトではUTF-8を使わないといけない様なことも書いてありました。 エラー内容は、 E2034 'int(*(_closure)(void*,int char**,char**))(void*,int,char**,char**)'型は'int(*)void*,int,char**,char**)'型に変換できない E2342 パラメータ'callback'はint(*)(void*,int,char**,char**)型として定義されているのでvoidは渡せない 以下、ソース抜粋です。 int TFmMain::callback(void* arg,int argc,char** argv,char** column){ AnsiString addr1=argv[0]; AnsiString addr2=argv[1]; AnsiString addr3=argv[2]; add_message(addr1+addr2+addr3); return SQLITE_OK; } void __fastcall TFmMain::Button1Click(TObject *Sender) { sqlite3* db; if(sqlite3_open("DBTEST1.db",&db)==SQLITE_OK){ add_message("DB open"); int rtn; char* sql; sql=sqlite3_mprintf("SELECT ADDR1,ADDR2,ADDR3 FROM ZIP WHERE ZIP=%d" ,StrToInt(Edit1->Text)); add_message(sql); rtn=sqlite3_exec(db,sql,callback,NULL,NULL); <<< ここでエラー発生します!! if(rtn!=SQLITE_OK){ add_message("COMMAND err"); } sqlite3_free(sql); sqlite3_close(db); add_message("DB close"); }else{ add_message("DB open err"); } }

  • MySQLのトランザクションについて

    初めて質問します。 今、PerlのDBIを使ってMySQLのトランザクション処理にチャレンジしています。 ところが、rollback処理がうまくできません。 具体的には、 table2 がある状態で下のプログラムを動かすと、 エラーの表示が出るのに、 table1 は作成されました。 何らかのエラーがあれば、どちらも作成されないようにしたいです。 ======================================================= my %sql; $sql{db_name} = "database"; $sql{host} = "localhost"; $sql{user_name} = "user_name"; $sql{password} = "password"; use DBI; my $dbh = DBI->connect('DBI:mysql:'.$sql{db_name}.':'.$sql{host}, $sql{user_name}, $sql{password} ,{RaiseError => 1, PrintError => 0, AutoCommit => 0 }) || &Err(); my $sth; my $re; eval { my $sql_string1 = "create table table1(`id` int);"; my $sql_string2 = "create table table2(`id` int);"; $sth = $dbh->prepare($sql_string1); $re = $sth->execute; $sth = $dbh->prepare($sql_string2); $re = $sth->execute; }; if ($@) { $tag="Err:".$@."\n"; $sth = $dbh->rollback; }else{ $sth = $dbh->commit; } $sth->finish; $dbh->disconnect; ======================================================= 検索して、いろいろいじっても解決しませんでした。 どうかよろしくお願いします。

    • ベストアンサー
    • Perl