2013-06-11 3 views
0

) 저는 Android 프로그래밍의 초보자이며 약간의 문제가 있습니다. 간단한 데이터베이스 (Data Base를 준비했습니다.)를 작성 했으므로 전화의 app 폴더에 복사해야합니다. 나는 이것을위한 방법이있다. 에뮬레이터에서 앱을 실행하면 모든 기능이 작동하지만 앱을 휴대 전화에 복사하면 앱이 다운됩니다. 너 나 좀 도와 줄 수있어?) (휴대 전화에서는 응용 프로그램 오류가 발생하지만 에뮬레이터에서는 표시되지 않습니다.

dbAdapter baza = new dbAdapter(this); 
baza.copyDatabase(); 

또는 baza.assetOpenDatabase; 이 dbAdapter입니다 :

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import android.app.Application; 
import android.content.ContentValues; 
import android.content.Context; 
import android.content.ContextWrapper; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteDatabase.CursorFactory; 
import android.database.sqlite.SQLiteOpenHelper; 

public class dbAdapter { 
private static final String DB_NAME = "names2.db"; 
private static final int DB_VERSION = 1; 
private static final String DB_TABLE = "names"; 
String DB_PATH; 
public static final String KEY_ID = "_id"; 
public static final String KEY_NAME = "name"; 
public static final int NAME_COLUMN = 1; 
public static final String KEY_SEX = "sex"; 
public static final int SEX_COLUMN = 2; 
public static final String KEY_RACE = "race"; 
public static final int RACE_COLUMN = 3; 
private SQLiteDatabase db; 
private final Context context; 
private DatabaseHelper myDatabaseHelper; 

public dbAdapter(Context _context){ 
    context = _context; 
    //DB_PATH = context.getApplicationContext().getFilesDir().getPath(); 

    DB_PATH = context.getFilesDir().getPath()+"/databases/"; 
    myDatabaseHelper = new DatabaseHelper(_context,DB_NAME,null,DB_VERSION); 
} 

public dbAdapter open(){ 
    db = myDatabaseHelper.getReadableDatabase(); 
    return this; 
} 

public void close(){ 
    db.close(); 
} 

public long insert(rekord _rekord){ 
    ContentValues newRekord = new ContentValues(); 
    newRekord.put(KEY_NAME, _rekord.getName()); 
    newRekord.put(KEY_SEX, _rekord.getSex()); 
    newRekord.put(KEY_RACE, _rekord.getRace()); 
    return db.insert(DB_TABLE, null, newRekord); 
} 
public String getData(String sex, String race) { 
    Cursor mycursor = db.rawQuery("SELECT name FROM names WHERE sex ="+sex+" AND race="+race+" ORDER BY RANDOM() LIMIT 1", null); 
     if(mycursor.moveToFirst()){ //Edited based on suggestion from SAM 
      String strCatName = mycursor.getString(mycursor.getColumnIndex(KEY_NAME)); 
        return strCatName; 
     } else { 
     return null; 
     } 
     // return db.rawQuery("SELECT name FROM names WHERE sex =1 ORDER BY RANDOM() LIMIT 1", new String[]{"name"}); 
    } 
public void copyDatabase() throws IOException{ //niby kopiowanie bazy danych. Nie wiem czy dobre bo nie chce działać 

    //Open your local db as the input stream 
    InputStream myInput = context.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 del(){ 
    File file = new File(DB_PATH+DB_NAME); 
    if(file.exists()) 
     file.delete(); 
} 



public SQLiteDatabase assetOpenDatabase() { 
    File dbFile = context.getDatabasePath(DB_NAME); 
    if (!dbFile.exists()) { 
     try { 
      assetCopyDatabase(dbFile); 
     } catch (IOException e) { 
      throw new RuntimeException("Error creating source database", e); 
     } 
    } 

    return SQLiteDatabase.openDatabase(dbFile.getPath(), null, SQLiteDatabase.OPEN_READONLY); 
} 

private void assetCopyDatabase(File dbFile) throws IOException { 
    InputStream is = context.getAssets().open(DB_NAME); 
    OutputStream os = new FileOutputStream(dbFile); 

    byte[] buffer = new byte[1024]; 
    while (is.read(buffer) > 0) { 
     os.write(buffer); 
    } 

    os.flush(); 
    os.close(); 
    is.close(); 
} 
//-------------------------------------------------------- 
class DatabaseHelper extends SQLiteOpenHelper{ 
    public DatabaseHelper(Context context, String name, CursorFactory factory, int version){ 
     super(context,name,factory,version); 
    } 
    @Override 
    public void onCreate(SQLiteDatabase _db){ 
     //_db.execSQL("CREATE TABLE names(_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, sex NUMERIC NOT NULL, race NUMERIC NOT NULL)"); 
    } 
    @Override 
    public void onUpgrade(SQLiteDatabase _db, int oldVer, int newVer){ 
     _db.execSQL("DROP TABLE IF EXISTS "+DB_TABLE); 
     onCreate(_db); 
    } 
} 
} 

그리고 내가 파일을 복사하는 방법 같은 효과.

당신이 당신의 DB 종자 사용중인 파일을 찾을 수없는
Ehh, now I have error on emulator too... 
06-11 21:31:20.510: E/AndroidRuntime(537): FATAL EXCEPTION: main 
06-11 21:31:20.510: E/AndroidRuntime(537): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.namesgenerator/com.example.namesgenerator.sex}: java.lang.RuntimeException: Error creating source database 
06-11 21:31:20.510: E/AndroidRuntime(537): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) 
06-11 21:31:20.510: E/AndroidRuntime(537): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
06-11 21:31:20.510: E/AndroidRuntime(537): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
06-11 21:31:20.510: E/AndroidRuntime(537): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
06-11 21:31:20.510: E/AndroidRuntime(537): at android.os.Handler.dispatchMessage(Handler.java:99) 
06-11 21:31:20.510: E/AndroidRuntime(537): at android.os.Looper.loop(Looper.java:123) 
06-11 21:31:20.510: E/AndroidRuntime(537): at android.app.ActivityThread.main(ActivityThread.java:3683) 
06-11 21:31:20.510: E/AndroidRuntime(537): at java.lang.reflect.Method.invokeNative(Native Method) 
06-11 21:31:20.510: E/AndroidRuntime(537): at java.lang.reflect.Method.invoke(Method.java:507) 
06-11 21:31:20.510: E/AndroidRuntime(537): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
06-11 21:31:20.510: E/AndroidRuntime(537): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
06-11 21:31:20.510: E/AndroidRuntime(537): at dalvik.system.NativeStart.main(Native Method) 
06-11 21:31:20.510: E/AndroidRuntime(537): Caused by: java.lang.RuntimeException: Error creating source database 
06-11 21:31:20.510: E/AndroidRuntime(537): at com.example.namesgenerator.dbAdapter.assetOpenDatabase(dbAdapter.java:108) 
06-11 21:31:20.510: E/AndroidRuntime(537): at com.example.namesgenerator.sex.onCreate(sex.java:39) 
06-11 21:31:20.510: E/AndroidRuntime(537): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
06-11 21:31:20.510: E/AndroidRuntime(537): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 
06-11 21:31:20.510: E/AndroidRuntime(537): ... 11 more 
06-11 21:31:20.510: E/AndroidRuntime(537): Caused by: java.io.FileNotFoundException: /data/data/com.example.namesgenerator/databases/names2.db (No such file or directory) 
06-11 21:31:20.510: E/AndroidRuntime(537): at org.apache.harmony.luni.platform.OSFileSystem.open(Native Method) 
06-11 21:31:20.510: E/AndroidRuntime(537): at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:232) 
06-11 21:31:20.510: E/AndroidRuntime(537): at java.io.FileOutputStream.<init>(FileOutputStream.java:94) 
06-11 21:31:20.510: E/AndroidRuntime(537): at java.io.FileOutputStream.<init>(FileOutputStream.java:66) 
06-11 21:31:20.510: E/AndroidRuntime(537): at com.example.namesgenerator.dbAdapter.assetCopyDatabase(dbAdapter.java:117) 
06-11 21:31:20.510: E/AndroidRuntime(537): at com.example.namesgenerator.dbAdapter.assetOpenDatabase(dbAdapter.java:106) 
06-11 21:31:20.510: E/AndroidRuntime(537): ... 14 more 
+0

logcat에서 스택 추적을 붙여 넣으십시오. –

답변

0

을 읽거나 수정할 수 없습니다 경우 012에 대한 플래그이 선택되지 않습니다. 이 옵션을 선택하면 장치가 디버깅 목적으로 SD 카드에 액세스 할 수 없으며 일반적으로 다른 용도로도 사용할 수 없습니다. 파일 작성이 실패한 이유가 그 것 같습니다.

+0

이것은 그 것이다! Thans;) – user2476195

+0

여러분을 환영합니다! – DigCamara

0

, 그것은 당신의 컴퓨터에 당신의 파일 시스템 (에뮬레이터를 찾을 수 있습니다)에 있어야합니다. 여기

은 로그 캣에서 관련 오류입니다 :

Caused by: java.io.FileNotFoundException: /data/data/com.example.namesgenerator/databases/names2.db 
+0

파일은'FileOutputStream'에 사용되며 존재하지 않으면 생성 될 것입니다. –

+0

감사합니다. – Booger

0

어느 디렉토리 /data/data/com.example.namesgenerator/databases가 없거나 액세스 권한에 문제가 (당신이 디렉토리에 파일을 만들 수 또는되지 않습니다있다

Settings->Storage 

에 가서 확인 휴대 전화에 이미 존재하는 파일)