2015-10-15 2 views
0

После обучения Так много уроков Теперь я создаю приложениеApp сбой при использовании внешнего Sqlite с SimpleCursor адаптером

Заявка содержит внешний SQLite database..now я пытаюсь отобразить первый столбец в виде списка, когда я пытаюсь показать мое приложение было crash..when я проверить в LogCat это просто скажет колонка «_id» не существует, но в моей базе данных у меня нет колонки, как column_id плз помочь здесь мой код ниже

моих Создать отчет в SqliteManager

CREATE TABLE "Ayervedic" ("Item No" NUMERIC NOT NULL , "Title" VARCHAR NOT NULL , "Subcategory" VARCHAR NOT NULL , "Details" VARCHAR NOT NULL , "Images" VARCHAR NOT NULL , PRIMARY KEY ("Item No", "Title", "Subcategory", "Details", "Images")) 

Класс Database

public class SqlLiteDbHelper extends SQLiteOpenHelper { 

// Database Version 
private static final int DATABASE_VERSION = 1; 

// Database Name 
private static final String DATABASE_NAME = "Ayervedic.sqlite"; 
private static final String DB_PATH_SUFFIX = "/databases/"; 
static Context ctx; 

public SqlLiteDbHelper(Context context) { 

    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    ctx = context; 
} 
public void CopyDataBaseFromAsset() throws IOException { 

    InputStream myInput = ctx.getAssets().open(DATABASE_NAME); 

    // Path to the just created empty db 
    String outFileName = getDatabasePath(); 

    // if the path doesn't exist first, create it 
    File f = new File(ctx.getApplicationInfo().dataDir + DB_PATH_SUFFIX); 
    if (!f.exists()) 
     f.mkdir(); 

    // 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(); 

} 

private static String getDatabasePath() { 

    return ctx.getApplicationInfo().dataDir + DB_PATH_SUFFIX + DATABASE_NAME; 

} 

public SQLiteDatabase openDataBase() throws SQLException { 

    File dbFile = ctx.getDatabasePath(DATABASE_NAME); 
    if (!dbFile.exists()) { 
     try { 
      CopyDataBaseFromAsset(); 

      System.out.println("Copying sucess from Assets folder"); 

     } catch (IOException e) { 

      throw new RuntimeException("Error creating source database", e); 

     } 

    } 
    return SQLiteDatabase.openDatabase(dbFile.getPath(), null, SQLiteDatabase.NO_LOCALIZED_COLLATORS | SQLiteDatabase.CREATE_IF_NECESSARY); 

} 

@Override 
public void onCreate(SQLiteDatabase db) { 

} 

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

} 
public Cursor gettitles(SQLiteDatabase db) 
{ 
    db = this.getReadableDatabase(); 

    Cursor cursor; 

    cursor = db.query(true, "Ayervedic", new String[]{"Title"}, null, null, null, null, null, null); 
    return cursor; 
} 

Основная деятельность

public class MainActivity extends AppCompatActivity { 

ListView listView; 
String title; 
SqlLiteDbHelper dbHelper; 

SQLiteDatabase sqLiteDatabase; 
Cursor cursor; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    listView= (ListView) findViewById(R.id.listView); 
    dbHelper = new SqlLiteDbHelper(this); 
    try { 
     dbHelper.openDataBase(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    sqLiteDatabase=dbHelper.getReadableDatabase(); 
    cursor=dbHelper.gettitles(sqLiteDatabase); 
    String[] from = new String[] { "Title" }; 
    int[] to = new int[] {R.id.textView }; 
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,R.layout.row_title,cursor,from,to); 
    adapter.notifyDataSetChanged(); 
    listView.setAdapter(adapter); 
} 

Logcat:

Process: com.example.ky.tamil, PID: 6286 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.ky.tamil/com.example.aeiltech.tamil.MainActivity}: java.lang.IllegalArgumentException: column '_id' does not exist 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2436) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2498) 
     at android.app.ActivityThread.access$900(ActivityThread.java:179) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1324) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:146) 
     at android.app.ActivityThread.main(ActivityThread.java:5641) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1288) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1104) 
     at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.IllegalArgumentException: column '_id' does not exist 
+0

Вы проверили это? http://stackoverflow.com/questions/3192064/about-id-field-in-android-sqlite – mach

+0

Хорошо, что имена ваших таблиц и базы данных также совпадают. Это не хорошая практика. После его изменения вы можете применить данные решения. – MDroid

ответ

1

SimpleCursorAdapter подкласс CursorAdapter. Документация states:

Курсор должен содержать столбец с именем «_id» или этот класс не будет работы.

В вашем случае вы можете просто переименовать первичный ключ Item No как _id

Edit: Кроме того, необходимо выбрать этот столбец курсора, даже он не отображается на вид.

cursor = db.query(true, "Ayervedic", new String[]{"Title", "_id"}, null, null, null, null, null, null); 
+0

как я могу это решить ?? @bwt – Karthick

+0

сомнение есть я не объявляю ITEM Нет в моей базе данных класс @bwt – Karthick

+0

я хотел бы изменить в классе базы данных или SqliteManager ?? @ bwt – Karthick

1

Ваш адаптер SimpleCursor нуждается в строке _id для использования.

CREATE TABLE "Ayervedic" (
    "_id" INT AUTOINCREMENT, 
    "Item No" NUMERIC NOT NULL, 
    "Title" VARCHAR NOT NULL, 
    "Subcategory" VARCHAR NOT NULL, 
    "Details" VARCHAR NOT NULL , 
    "Images" VARCHAR NOT NULL , 
    PRIMARY KEY ("_id") 
); 
+0

есть! но я не знаю, что делать? @mach – Karthick

+0

спасибо Но я использую внешнюю базу данных, как мы можем писать CREATE_TABLE в Oncreate ?? это возможно? @mach – Karthick

1

Try This

Cursor c = db.rawQuery(" SELECT "+ Title + " AS _id from Ayervedic"); 

означает, что вы выберите название и создать псевдоним его с помощью AS в _id, и вы выбираете этот идентификатор из Ayervedic таблицы. так что теперь вы сможете получить доступ к результату этого запроса из имени столбца _id и получить доступ к результату:

c.moveToFirst();  
    while (c.moveToNext()) 
    { 
    System.out.println(c.getString(c.getColumnIndex("_id")); 
    } 
+0

thx, но в этом поле имена столбцов имеют дублирование, как мы можем избежать этого, – Karthick

+0

означает? Я тебя не понимаю. какие имена столбцов имеют дублирование? – MDroid

+0

Это означает, что в моем заголовке Colum у меня есть поля в определенное время (т.е.) Apple, orange, grapes, Apple, orange, grapes. Как избежать этого дублирования. Мне нужно только одно яблоко, апельсин, виноград – Karthick