0

データベースを使用していくつかのコードを試しました。アセットフォルダーにコピーした既存のデータベースを使用しようとしています。ポップアップに SQL クエリの結果を表示したい。私が試したコードは

package com.example.singlepop;

import java.io.IOException;
import java.util.Calendar;

import android.os.Bundle;
import android.app.Activity;
import android.database.Cursor;
import android.database.SQLException;
import android.view.Menu;

import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;

public class Single extends Activity {
    PopupWindow popUp;
     LinearLayout layout;
     TextView tv;
     LayoutParams params;
     LinearLayout mainLayout;
     Button but;
     boolean click = true;




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        DataBaseHelper myDbHelper = new DataBaseHelper(this);
         try {

             myDbHelper.createDataBase();

             } catch (IOException ioe) {

             throw new Error("Unable to create database");

             }
         try {

             myDbHelper.openDataBase();

             }catch(SQLException sqle){

             throw sqle;

             }

          popUp = new PopupWindow(this);
          layout = new LinearLayout(this);
          mainLayout = new LinearLayout(this);



          final Calendar cld = Calendar.getInstance();

          int time = cld.get(Calendar.HOUR_OF_DAY);
          if(time==20)
          {
              tv = new TextView(this);
              but = new Button(this);

          but.setText("Click me for pop up");
          but.setOnClickListener(new OnClickListener() {

           public void onClick(View v) {
            if (click) {
             popUp.showAtLocation(layout, Gravity.BOTTOM, 10, 10);
             popUp.update(50, 50, 300, 80);
             click = false;
            } else {
             popUp.dismiss();
             click = true;
            }
           }

          });
          params = new LayoutParams(LayoutParams.WRAP_CONTENT,
            LayoutParams.WRAP_CONTENT);
          layout.setOrientation(LinearLayout.VERTICAL);
          //tv.setText("Time is 8 pm");

          // display the outcome of the query
          tv.setText(myDbHelper.thought());


          layout.addView(tv, params);
          popUp.setContentView(layout);
          // popUp.showAtLocation(layout, Gravity.BOTTOM, 10, 10);
          mainLayout.addView(but, params);
          setContentView(mainLayout);
          }
          else
          {
              tv.setText("NO TIME");
          }




    }




    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.single, menu);
        return true;
    }

}

このコードにより、ポップアップが成功します。データベース「MyDatabase」を作成し、アセットフォルダーにコピーしました。私のDataBaseHelperクラスは

package com.example.singlepop;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;

public class DataBaseHelper extends SQLiteOpenHelper {
     private static final int _id = 1;

    //The Android's default system path of your application database.
    private static String DB_PATH = "/data/data/com.example.singlepop/databases/";

    private static String DB_NAME = "MyDatabase";

    private SQLiteDatabase myDataBase;

    private final Context myContext;

    private static String DB_TABLE = "Totlist";

    private static final String tot = null;

    String des=tot;

    /**
      * Constructor
      * Takes and keeps a reference of the passed context in order to access to the application assets and resources.
      */
    public DataBaseHelper(Context context) {

    super(context, DB_NAME, null, 1);
    this.myContext = context;
    }

     /**
      * Creates a empty database on the system and rewrites it with your own database.
      * */
    public void createDataBase() throws IOException{

    boolean dbExist = checkDataBase();

    if(dbExist){
    //do nothing - database already exist
    }else{

    //By calling this method and empty database will be created into the default system path
    //of your application so we are gonna be able to overwrite that database with our database.
    this.getReadableDatabase();

    try {

    copyDataBase();

    } catch (IOException e) {

    throw new Error("Error copying database");


    }

    }
    }   

     /**
      * Check if the database already exist to avoid re-copying the file each time you open the application.
      * @return true if it exists, false if it doesn't
      */
    private boolean checkDataBase(){

    SQLiteDatabase checkDB = null;

    try{
    String myPath = DB_PATH + DB_NAME;
    checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

    }catch(SQLiteException e){

    //database does't exist yet.

    }

    if(checkDB != null){

    checkDB.close();

    }

    return checkDB != null ? true : false;
    }

     /**
      * Copies your database from your local assets-folder to the just created empty database in the
      * system folder, from where it can be accessed and handled.
      * This is done by transfering bytestream.
      * */
    private void copyDataBase() throws IOException{

    //Open your local db as the input stream
    InputStream myInput = myContext.getAssets().open(DB_NAME);

    // Path to the just created empty db
    String outFileName = DB_PATH + DB_NAME;

    //Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream(outFileName);

    //transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer))>0){
    myOutput.write(buffer, 0, length);
    }

    //Close the streams
    myOutput.flush();
    myOutput.close();
    myInput.close();

    }

     public void openDataBase() throws SQLException{

        //Open the database
        String myPath = DB_PATH + DB_NAME;
        myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

        }

     @Override
     public synchronized void close() {

     if(myDataBase != null)
     myDataBase.close();

     super.close();

     }

     @Override
     public void onCreate(SQLiteDatabase db) {

     }

     @Override
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

     }

         // This function should return the outcome of the query but below code is wrong
     public String thought()
     {

         String quer="Hello";
         String sql = "SELECT * FROM option WHERE id = 1";
         Cursor check = myDataBase.rawQuery(sql, null);
         quer=String.valueOf(check);
        return quer;

     }



}

rawQueryCursorsetText を使用して表示できない型を返します。ポップアップに表示される b へのクエリの結果を取得するにはどうすればよいですか。これを実行すると、多くのエラーが発生しlogcatます。接続に問題がある可能性があります。

08-28 20:00:57.396: E/Trace(841): error opening trace file: No such file or directory (2)
08-28 20:00:59.003: E/SQLiteLog(841): (14) cannot open file at line 30176 of [00bb9c9ce4]
08-28 20:00:59.023: E/SQLiteLog(841): (14) os_unix.c:30176: (2) open(/data/data/com.example.singlepop/databases/MyDatabase) - 
08-28 20:00:59.173: E/SQLiteDatabase(841): Failed to open database '/data/data/com.example.singlepop/databases/MyDatabase'.
08-28 20:00:59.173: E/SQLiteDatabase(841): android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database

まだエラーが多い

4

4 に答える 4

0

あなたの質問を理解しているかどうかはわかりませんが、データベースをセットアップして読み取る方法は次のとおりです。

public class SQLTest extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "TestDatabase.db";
private static final int DATABASE_VERSION = 1;
private Context context;

public static final String TABLENAME = "mytable";
public static final String COL_ID = "_id";
public static final String COL_NAME = "name";


public SQLSimple(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    this.context = context;
}

@Override
public void onCreate(SQLiteDatabase db) {
    String STATEMENT_CREATE = "create table if not exists '"+TABLENAME+"' ("
        +COL_ID+" integer primary key autoincrement, "
        +COL_NAME+" text not null, "
    db.execSQL(STATEMENT_CREATE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    String STATEMENT_DROP = "drop table if exists '"+TABLENAME+"';";
    db.execSQL(STATEMENT_DROP);

    onCreate(db);
}

public String readName(int id) {
    SQLiteDatabase db = getReadableDatabase();
    Cursor cursor = null;
    try {
        //Return these two columns only. Here, we only have two of course, but in a bigger table this is good for performance.
        String[] projection = new String[]{COL_ID, COL_NAME};

        //The where part of the query that defines what we are looking for
        String selection = COL_ID + " = ?";

        //The data that will replace the ? in the query before. Doing it this way is to prevent injection and escaping errors
        String selectionArgs[] = new String[]{id+""};
        cursor = db.query(TABLENAME, projection, selection, selectionArgs, null, null, null);

        String name = null;

        if(cursor.moveToFirst()) {
            String name = cursor.getString(cursor.getColumnIndex(COL_NAME));
        }

        return name;
    } finally {
        //Close the database before returning item, even in the case of an exception
        if (cursor != null && !cursor.isClosed()) {
            cursor.close();
        }
        if (db.isOpen()) {
            db.close();
        }
    }
}

これがあなたの質問に答えることを願っています。そうでない場合は、お尋ねください。

于 2013-08-28T15:17:22.690 に答える
0

表示されるエラー メッセージは、データベース ファイル/data/data/com.example.singlepop/databases/MyDatabaseが存在しないことを示しています。それを確認できますか?

また、これが機能すると、Cursorはクエリから取得したすべての結果を表します。複数のレコードを返すことができます。最初に読み取りたい行にカーソルを置き、次に個々の列にアクセスできます。例(すべてのエラー処理を省略し、テーブルに という名前の列があると仮定しますcol1):

check.moveToFirst();
String col1 = check.getString(check.getColumnIndex("col1"));
于 2013-08-28T15:10:24.240 に答える