0

ファイル エクスプローラーでデータベース ファイルを /assets から /data/data フォルダーにコピーする際に問題が発生します。私はこのウェブサイトを検索し、多くの回答を見つけましたが、私の文脈に合った適切な回答を見つけることができませんでした. SQLite Manager を使用して外部でデータベースを作成し、assets フォルダーにインポートしました。ここで、アプリケーションを実行すると、エミュレーターで NullPointerException が発生します。パッケージが /data/data フォルダーにまったく作成されていないことがわかりました。しかし、アプリケーションはエミュレーターで起動しています。デバッガーもエラーを表示しませんでした。

私は次の解決策を試しました -

Eclipseとエミュレーターを再起動し、既存のエミュレーターを削除して再作成し、最終的にラップトップを再起動しました

どの解決策も私の問題を解決しませんでした。誰か教えてください、私の間違いは何ですか?

これが私の MainActivity.java です:-

public class MainActivity extends Activity implements OnClickListener
{
Dialog d;
private photoDbAdapters mDbAdapter;
public int currentimageindex=0;
 String[] sp;   

int p=1;

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        images();
 }
 public void images()
 {
        try{
            String rt=mDbAdapter.fetchsingles(); //the application 
                                           is getting crashed in this part

        int id = getResources().getIdentifier(rt, null, null);
        ImageView iv = (ImageView) findViewById(R.id.ImageView3_Left);
        iv.setImageResource(id);
    }catch(NullPointerException er)
{
        String ht=er.toString();
        Toast.makeText(getApplicationContext(), ht, Toast.LENGTH_LONG).show    ();
    }}


@Override
public void onClick(View v)
{
    finish();
    android.os.Process.killProcess(android.os.Process.myPid());
    // TODO Auto-generated method stub
}

fetchsingles メソッド :- (このメソッドはデータベースから画像ファイル名を取得します)

public String fetchsingles()
{

    try{

img = mDbHelper.getData();


    }catch(Exception e)
    {
        String error= e.toString();
        Dialog d = new Dialog(null);
        d.setTitle("image cannot be fetched");
        int err=Integer.parseInt(error);
        d.setContentView(err);
        d.show();
    }
    return img;


}

getdata メソッド:-

public String getData() 
{
    // TODO Auto-generated method stub

    String dry="SELECT "+COL_DATA+" FROM Photos WHERE "+COL_ID+"=2;";

        Cursor c = myDataBase.rawQuery(dry,null);

        String result = "";
        int img = c.getColumnIndex(COL_DATA);


            result = c.getString(img);





    return dry;

コードは長く見えるかもしれませんが、気にしないでください。この問題を解決するのを手伝ってください。

前もって感謝します。

4

1 に答える 1

1

以下のコードを使用して、データベースをアセットから data/data/package ディレクトリにコピーしてみてください

package com.example.myapp;

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;
import android.util.Log;

      public class DataBaseHelper1 extends SQLiteOpenHelper{
      private static String DB_PATH = "/data/data/com.example.myapp/databases/";

      private static String DB_NAME = "myDB.sqlite";

      private SQLiteDatabase myDataBase;

      private final Context myContext;

      public DataBaseHelper1(Context context) 
      {
          super(context, DB_NAME, null, 1);
          this.myContext = context;
      }

      public void createDataBase() throws IOException{


    boolean dbExist = checkDataBase();

      if(dbExist)
      {
          Log.i("DB....", "database available....");
      }
      else
      {
          this.getWritableDatabase();

          try {

          copyDataBase();

          } catch (IOException e) {

          throw new Error("Error copying database");

          }

         Log.i("DB..", "database created.....");
       }   

      }


      public boolean checkDataBase(){

      SQLiteDatabase checkDB = null;

      try{

      String myPath = DB_PATH + DB_NAME;

      checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);

      }catch(SQLiteException e){

          Log.e("CheckDb","DB not found");
      //database does't exist yet.

      if(checkDB != null){

      checkDB.close();

      }
      }
      finally
      {
          if(checkDB != null){

              checkDB.close();

              } 
          this.close();
      }
      return checkDB != null ? true : false;

      }




      private void copyDataBase() throws IOException{

      InputStream myInput = myContext.getAssets().open(DB_NAME);

      String outFileName = DB_PATH + DB_NAME;

      OutputStream myOutput = new FileOutputStream(outFileName);
          byte[] buffer = new byte[1024];

      int length;

      while ((length = myInput.read(buffer))>0){

      myOutput.write(buffer, 0, length);

      }

      myOutput.flush();

      myOutput.close();

      myInput.close();

      }

      public SQLiteDatabase openDataBase() throws SQLException{

      String myPath = DB_PATH + DB_NAME;

      return myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);

      }


      @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) {


      }  


      public void getData()
      {
          SQLiteDatabase myDB ;
          Cursor cursor ;
           try {

                myDB=this.openDataBase();                   

                    cursor=myDB.rawQuery("SELECT * FROM Country_Master",null);


                    if (cursor != null ) {
                       if  (cursor.moveToFirst()) {
                       do {

                           // put your code to get data from cursor                      

                       }while (cursor.moveToNext());
                       }

                    }



                   if(cursor != null)
                    {
                        myDB.close();
                       cursor.close();
                    }                      
                    }catch(SQLException sqle){

                    throw sqle;

                    }


        }
}

また、データベースをコピーするアクティビティの onCreate メソッドの下にこのコードを配置します。

 DataBaseHelper1 myDbHelper = new DataBaseHelper1(MyActivity.this); 
     try 
     {
         myDbHelper.createDataBase();
     }catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            }

     finally
     {
         myDbHelper.close();
     }
于 2013-08-29T08:55:56.640 に答える