2013-08-29 2 views
-1

У меня есть проблемы с копированием файла базы данных из/в папку/data/data в файловом проводнике. Я искал этот сайт, нашел много ответов, но не смог найти подходящий ответ, который соответствует моему контексту. Я создал базу данных внешне с помощью SQLite Manager и импортировал ее в папку с ресурсами. Теперь, когда я запускаю свое приложение, я получаю NullPointerException в эмуляторе. Я обнаружил, что пакет вообще не создан в папке/данных/данных. Но приложение запускается в эмуляторе. Отладчик также не обнаружил ошибок.копирование файла базы данных из/активов в папку данных/данных в проводнике файлов - Android

Я попытался следующие решения -

перезапущен затмение и эмулятор, уничтоженный и воссозданный существующий эмулятор, наконец перезапуске ноутбук

Ни одно из решений не решить мою проблему. Может ли кто-нибудь мне рассказать, какова моя ошибка?

Вот мой 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; 

Код может выглядеть длинным, ничего против, и, пожалуйста, помогите мне в решении этой проблемы.

Заранее спасибо.

+0

Возможный дубликат [проблема с копированием данных из активов в приложение] (http://stackoverflow.com/questions/6609186/problem-in-copying-data-from-assets-to-application) –

+0

Только поместите код как указано это вопрос «копирование файла базы данных из/assets в/data/data folder» remo ve ненужные коды и сделать его простым, а также искать в stackoverflow для ответов, прежде чем задавать вопрос! –

+0

На самом деле, я искал много вопросов, пробовал все эти решения. Но каждый раз, когда приложение неожиданно срабатывает. – nki

ответ

1

Попробуйте использовать ниже код, чтобы скопировать базу данных из активов в каталоге данные/данные/пакет

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(); 
    } 
+0

Спасибо @Chirag Ghori, я пробовал тот же код ранее, но мое приложение не запускалось должным образом. – nki

+0

Если вы ничего не против, я скажу одно. Если ваш ответ решит мою проблему, я обязательно буду отвечать на ваш ответ. – nki

+1

@nki убедитесь, что вы правильно поместили строку DB_PATH DB_NAME и тот же файл, формат файла в активах!прежде чем пытаться в следующий раз, удалите или удалите файл DB из пути DB в DDMS –

Смежные вопросы