2015-07-23 3 views
0

Я попробовал решение в этой теме: SQL Android Error: no such tableSQLite ошибки нет такой таблицы на fetchRows()

... безрезультатно.

Я просто пытаюсь открыть и извлечь все строки из базы данных SQL-pre-build, которую я сделал с помощью командной строки в своем приложении.
Он сохранил файл как «names.db».
Я пошел вперед и переместил его в папку в моем основном проектном файле под названием «активы» («C: \ ... \ AndroidStudioProjects \ MyProject \ app \ src \ main \ assets \ names.db»).

Я использую это стек решение в качестве шаблона, более или менее: https://stackoverflow.com/a/9109728/1438611

Вот текущий код в соответствии с классами моей трассировки стеки жалуется:

public class MainActivity extends Activity { 
    private NamesDataSource dataSource; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     dataSource = new NamesDataSource(this); 
     try { 
      dataSource.open(); 
     } 
     catch (SQLException se) { 
      se.printStackTrace(); 
     } 

     ListView lv = (ListView) findViewById(R.id.ListView); 
     List<Names> values = dataSource.getAllNames(); 
     ArrayAdapter<Names> adapter = new ArrayAdapter<Names>(this, android.R.layout.simple_list_item_1, values); 
     lv.setAdapter(adapter); 
    } 
} 

// DBHelper класс

public class MySQLiteHelper extends SQLiteOpenHelper { 
    public static final String TABLE_NAMES = "names"; 
    public static final String COLUMN_ID = "_id"; 
    public static final String COLUMN_NAME = "name"; 

    private static final String DATABASE_NAME = "names.db"; 
    private static String DB_PATH = ""; 
    private static final int DATABASE_VERSION = 3; 
    private static final String DATABASE_CREATE = "CREATE TABLE names (_id integer PRIMARY KEY, name text, phone text, email text);"; 
    private final Context mContext; 
    private SQLiteDatabase mDataBase; 

    public MySQLiteHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     DB_PATH = context.getApplicationInfo().dataDir + "/databases/"; 

     this.mContext = context; 
    } 

    public void createDataBase() throws IOException { 
     //If database not exists copy it from the assets 
     boolean mDataBaseExist = checkDataBase(); 
     if(!mDataBaseExist) 
     { 
      this.getReadableDatabase(); 
      try 
      { 
       //Copy the database from assets 
       copyDataBase(); 
       Log.e("MySQLiteHelper", "createDatabase database created"); 
      } 
      catch (IOException mIOException) 
      { 
       throw new Error("ErrorCopyingDataBase"); 
      } 
     } 
    } 

    private boolean checkDataBase() { 
     File dbFile = new File(DB_PATH + DATABASE_NAME); 
     //Log.v("dbFile", dbFile + " "+ dbFile.exists()); 
     return dbFile.exists(); 
    } 

    private void copyDataBase() throws IOException 
    { 
     InputStream mInput = mContext.getAssets().open(DATABASE_NAME); 
     String outFileName = DB_PATH + DATABASE_NAME; 
     OutputStream mOutput = new FileOutputStream(outFileName); 
     byte[] mBuffer = new byte[1024]; 
     int mLength; 
     while ((mLength = mInput.read(mBuffer))>0) 
     { 
      mOutput.write(mBuffer, 0, mLength); 
     } 
     mOutput.flush(); 
     mOutput.close(); 
     mInput.close(); 
    } 

    public boolean openDataBase() throws SQLException 
    { 
     String mPath = DB_PATH + DATABASE_NAME; 
     mDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.CREATE_IF_NECESSARY); 
     return mDataBase != null; 
    } 

    @Override 
    public void onCreate(SQLiteDatabase database) { 
    } 

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

    public Cursor fetchRows() { 
     String query = "SELECT * FROM " + TABLE_NAMES; 
     Cursor cursor = mDataBase.rawQuery(query, null); 
     return cursor; 
    } 

    @Override 
    public synchronized void close() 
    { 
     if(mDataBase != null) 
      mDataBase.close(); 
     super.close(); 
    } 
} 

// DAO/адаптер класса

public class NamesDataSource { 
    private SQLiteDatabase db; 
    private MySQLiteHelper dbHelper; 
    private String[] allNames = { 
      MySQLiteHelper.COLUMN_ID, 
      MySQLiteHelper.COLUMN_NAME 
    }; 

    public NamesDataSource(Context context) { 
     dbHelper = new MySQLiteHelper(context); 
    } 

    public void open() throws SQLException { 
     try { 
      dbHelper.createDataBase(); 
     } 
     catch (Exception ioe) { 
      throw new Error("Unable to create database"); 
     } 
     try { 
      dbHelper.openDataBase(); 
     } 
     catch(Exception se){ 
      se.printStackTrace(); 
     } 
    } 

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

    public List<Names> getAllNames() { 
     List<Names> names = new ArrayList<>(); 

     Cursor cursor = dbHelper.fetchRows(); 

     cursor.moveToFirst(); 

     while(!cursor.isAfterLast()) { 
      Names row = cursorToName(cursor); 
      names.add(row); 
      cursor.moveToNext(); 
     } 

     cursor.close(); 
     return names; 
    } 

    private Names cursorToName(Cursor cursor) { 
     Names name = new Names(); 
     name.setIds(cursor.getLong(0)); 
     name.setName(cursor.getString(1)); 
     name.setPhone(cursor.getString(2)); 
     name.setEmail(cursor.getString(3)); 

     return name; 
    } 
} 

И, наконец, сообщение об ошибке:

android.database.sqlite.SQLiteException: no such table: names (code 1): , while compiling: SELECT * FROM names 
      at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
      at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889) 
      at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500) 
      at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
      at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 
      at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37) 
      at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44) 
      at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1316) 
      at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1255) 
      at com.example.user.myproject.MySQLiteHelper.fetchRows(MySQLiteHelper.java:96) 
      at com.example.user.myproject.NamesDataSource.getAllNames(NamesDataSource.java:49) 
      at com.example.user.myproject.MainActivity.onCreate(MainActivity.java:44) 
      at android.app.Activity.performCreate(Activity.java:5990) 
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390) 
            at android.app.ActivityThread.access$800(ActivityThread.java:151) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:135) 
            at android.app.ActivityThread.main(ActivityThread.java:5257) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:372) 

Благодаря тонну для всех желающих взглянуть на это.
Cheers.

ответ

0

Этот путь является неправильным:

DB_PATH = context.getApplicationInfo().dataDir + "/databases/"; 

было бы вернуть

"/data/data/com.example.user.myproject/databases/databases/"

но вы хотите только

"/data/data/com.ex ample.user.MyProject/базы данных /»

Меняют его

DB_PATH = context.getApplicationInfo().dataDir; 

Или, в качестве альтернативы, к

Я использую последний.

+1

работал отлично, Спасибо Спасибо спасибо! –

0

Я не вижу, как вы создаете стол? где код для его создания?

Вы должны использовать DATABASE_CREATE

в onCreate() попробуйте использовать код database.execSQL(DATABASE_CREATE);

и в onUpgrade() месте db.execSQL("DROP TABLE IF EXISTS names");

Remember кэширует базу данных так, попробуйте переустановить приложение с нуля тоже.

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