1

SQL は初めてです。Sqlite マネージャーを使用して作成した Emergency_no というデータベースがあります。これは、「emergency_no」という名前のテーブルが 1 つだけの単純なデータベースです。Emergency_no.sqlite という名前のデータベースはアセット フォルダにありますが、エミュレータで実行すると次のように表示されます。

android.sqlite.SQLiteException:no such table :emergency_no:

/data/data/com.citymasetro/database/ で Emergency_no.sqlite と Emergency_no.journel を取得しましたが、

私のdbhelperコードは以下です

package com.citymaestro;

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.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;


 public class Dbmanager1 {

public static final String  KEY_ROWID="_id";
public static final String  policeno="police_no";
public static final String  fireno="fire_no";
public static final String  ambulanceno="ambulance_no";
public static final String  womenno="women_cell";

public static final String  DATABASE_NAME="emergency_no";
public static final String DATABASE_TABLE="emergency_no";
public static final int DATABASE_VERSION=1;
private static String DB_PATH = "/data/data/com.citymaestro/databases/";


public Dbhelper ourhelper;
public static Context ourcontext;
public SQLiteDatabase ourdatabase;


private static class Dbhelper extends SQLiteOpenHelper{
    private boolean mCreateDatabase = false;
    private boolean mUpgradeDatabase = false;

    public Dbhelper(Context context) {
        super(context, DATABASE_NAME, null, 1);
        // TODO Auto-generated constructor stub
    }






    public void initializeDatabase(String path) {
           // DATABASE_PATH = path;
            getWritableDatabase();

            if(mUpgradeDatabase) {
                ourcontext.deleteDatabase(DATABASE_NAME);
            }

            if(mCreateDatabase || mUpgradeDatabase) {
                try {
                    createDataBase();
                } catch (IOException e) {
                    throw new Error("Error copying database");
                }
            }
        }


        public void createDataBase() throws IOException
        {
            boolean dbExist = checkDataBase();


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

                this.getReadableDatabase();

                try {

                    copyDataBase();

                } catch (IOException e) {

                    throw new Error("Error copying database");

                }
            }

        }

        private boolean checkDataBase()
        {
            SQLiteDatabase checkDB = null;

            try
            {
                String myPath = DB_PATH + DATABASE_NAME;
                checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS | SQLiteDatabase.CREATE_IF_NECESSARY);


            }catch(SQLiteException e)
            {
                //database does't exist yet.
            }
            if(checkDB != null)
            {
                checkDB.close();
            }

            return checkDB != null ? true : false;
        }
        private void copyDataBase() throws IOException
        {
            //Open your local db as the input stream
            InputStream myInput = ourcontext.getAssets().open(DATABASE_NAME);

            // Path to the just created empty db
            String outFileName = DB_PATH + DATABASE_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();
        }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
    /*  try {
            createDataBase();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Log.d("GAG","oncreatem");
        }
        */
        mCreateDatabase = true;
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        mUpgradeDatabase = true;
    }

}
public Dbmanager1(Context c)
{
    ourcontext=c;
    //Dbhelper dbh=new Dbhelper(ourcontext);

    //Log.d("gag","constru");
}
 public Dbmanager1 open(){
     ourhelper=new Dbhelper(ourcontext);
     ourdatabase=ourhelper.getWritableDatabase();
     return this;
 }

 public void close(){
     ourhelper.close();

 }
 public String getdata() {
        // TODO Auto-generated method stub
        String[] columns= new String[]{ KEY_ROWID,policeno};
        Cursor c =ourdatabase.query(DATABASE_TABLE, columns, null, null,null, null, null);
        String result="";
        int irow=c.getColumnIndex(KEY_ROWID);
        int irow2=c.getColumnIndex(policeno);
        for(c.moveToFirst(); !c.moveToLast();c.moveToNext()){
            result=result + c.getString(irow) + "" +c.getString(irow2) + "\n";
        }

        return result;
    }


}

これを searchscreen.java から呼び出しています

       String str;
    db.open();
    // Log.d("TAG","before str");
     try {
        str=db.getdata();
        // Log.d("TAG",str);
         db.open();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        Log.d("TAG",e.toString());
    }
    searchscreen sc;
    //sc= db.getdata(i, k);
    db.close();

私は間違いを見つけることができません。前もって感謝します

4

1 に答える 1

0

問題は、テーブルが存在しない状態でクエリを実行しているため、最初にテーブルを作成する必要があることです。たとえば、テーブルに 2 つのフィールド (GUIDE_ID と PRIMARY_KEY) を含めることができます。

public static final String create_emerg_table =  "create table "+ 
            Constants.EMERG_TABLE + " ("+
            Constants.EMERG_GUIDE_ID + " integer, "+
            Constants.EMERG_PRIMARY_KEY + " integer primary key autoincrement);";

次に、onCreate からテーブルを作成します。

@Override
public void onCreate(SQLiteDatabase db) {
    Log.v(TAG, "Creating all the tables");
        try
        {
            db.execSQL(create_emerg_table);
        }catch(SQLException ex)
        {
            Log.e(TAG, ex.getMessage());
        }
}
于 2013-04-07T07:44:43.483 に答える