2015-03-04 5 views
1

Я создал приложение базы данных, которое позволит пользователю искать базу данных фильмов. Мое понимание заключается в том, что при нажатии кнопки поиска он должен вызвать метод поиска, чтобы проверить записи в базе данных и вернуть запись, которая соответствует поисковому запросу, но после нажатия кнопки она вызывает сбой приложения, любая помощь и объяснение будут оценены. Было бы также быть большим, чтобы подтвердить, что база данных создается благодаряПри нажатии кнопки, сбой базы данных приложения

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

public class MainActivity extends ActionBarActivity { 
     public final static String FILM = "com.mnt.filmapp6.FILM"; 
     protected SQLiteDatabase db; 

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

     Button btnAddFilm = (Button) findViewById(R.id.add_film); 
     Button btnFavourite = (Button) findViewById(R.id.favourites); 

     btnAddFilm.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(getApplicationContext(), MainActivity2.class); 
       startActivity(intent); 
      } 
     }); 

     btnFavourite.setOnClickListener(new View.OnClickListener() { 

              @Override 
              public void onClick(View v) { 
               Intent intent = new Intent(getApplicationContext(), MainActivity3.class); 
               startActivity(intent); 
              } 
             } 
     ); 
    } 

    public void search(View v){ 
     EditText edtSearch = (EditText)findViewById(R.id.edtSearch); 
     String search = "%" + edtSearch.getText().toString() + "%"; 
     db = new DbHelper(this).getReadableDatabase(); 
     String[] tblColumns = {"*"}; 
     String where = "film LIKE ? OR actor LIKE ? OR actor2 LIKE ? OR director LIKE ?"; 
     String[] whereArgs = {search, search, search, search}; 
     Cursor results = db.query("FILMTABLE", tblColumns, where, whereArgs, null, null, null); 
     films(results); 
    } 

    public void films (Cursor c){ 

     int titleIndex = c.getColumnIndex("film"); 
     int directorIndex = c.getColumnIndex("director"); 
     int idIndex = c.getColumnIndex("id"); 
     String title = c.getString(titleIndex); 
     String director = c.getString(directorIndex); 
     int filmID = c.getInt(idIndex); 

     TextView txt = new TextView(getApplicationContext()); 
     txt.setId(filmID); 
     txt.setText(title + ", " + director); 
     txt.setTextColor(Color.BLACK); 
     txt.setTextSize(15); 
     //txt.setText(ScrollView); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 
     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 

Dbhelper

public DbHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL("CREATE TABLE " + TABLE_NAME + " (" + 
     ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
        FILM + "TEXT NOT NULL, " + 
         ACTOR + "TEXT NOT NULL, " + 
         ACTOR2 + "TEXT NOT NULL, " + 
         DIRECTOR + "TEXT NOT NULL, " + 
         DESCRIPTION + "TEXT NOT NULL);" 
     ); 

     Cursor countRows = db.rawQuery("SELECT count(*) FROM FILMTABLE", null); 
     countRows.moveToFirst(); 
     int NumRows = countRows.getInt(0); 
     countRows.close(); 

     if (NumRows == 0) { 
      ContentValues values = new ContentValues(); 

      values.put("film", "Wolf of Wall Street"); 
      values.put("actor", "Leonardo Dicaprio"); 
      values.put("actor2", "Jonah Hill"); 
      values.put("director", "Martin Scorses"); 
      values.put("description", "True story of New York stockbroker Jordan Belfort. From the American dream to corporate greed, Belfort goes from penny stocks and righteousness to IPOs and a life of corruption in the late 80's."); 
      db.insert("FILMTABLE", null, values); 
      values.clear(); 

      values.put("film", "Captain Philips"); 
      values.put("actor", "Tom Hanks"); 
      values.put("actor2", "Catherine Keener"); 
      values.put("director", "Paul Greengrass"); 
      values.put("description", "True story, Captain Phillips is a multi-layered examination of the 2009 hijacking of the U.S. container ship Maersk Alabama by a crew of Samali pirates."); 
      db.insert("FILMTABLE", null, values); 
      values.clear(); 

     } 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL("DROP TABLE IF EXISTS" + TABLE_NAME); 
     onCreate(db); 
    } 
} 

Главная activty XML

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> 

<TextView android:text="@string/film_app" android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:id="@+id/textView" /> 

<Button 
    style="?android:attr/buttonStyleSmall" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/search" 
    android:id="@+id/search" 
    android:layout_below="@+id/edtSearch" 
    android:layout_centerHorizontal="true" 
    android:onClick="search"/> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/add_film" 
    android:id="@+id/add_film" 
    android:layout_below="@+id/favourites" 
    android:layout_alignLeft="@+id/search" 
    android:layout_alignStart="@+id/search" 
    android:onClick="add"/> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/favourites" 
    android:id="@+id/favourites" 
    android:layout_below="@+id/search" 
    android:layout_centerHorizontal="true" 
    android:onClick="favourite"/> 

<EditText 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/edtSearch" 
    android:hint="Enter Film/Actor/Director" 
    android:layout_below="@+id/textView" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="34dp" /> 

<ScrollView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_centerVertical="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true"> 

    <LinearLayout 
     android:id="@+id/resultLayout" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="vertical"> 

    </LinearLayout> 
</ScrollView> 

Logcat

03-04 12:16:53.829 1879-1879/com.mnt.filmapp6 E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.mnt.filmapp6, PID: 1879 
java.lang.IllegalStateException: Could not execute method of the activity 
     at android.view.View$1.onClick(View.java:4007) 
     at android.view.View.performClick(View.java:4756) 
     at android.view.View$PerformClick.run(View.java:19749) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5221) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
Caused by: java.lang.reflect.InvocationTargetException 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at android.view.View$1.onClick(View.java:4002) 
            at android.view.View.performClick(View.java:4756) 
            at android.view.View$PerformClick.run(View.java:19749) 
            at android.os.Handler.handleCallback(Handler.java:739) 
            at android.os.Handler.dispatchMessage(Handler.java:95) 
            at android.os.Looper.loop(Looper.java:135) 
            at android.app.ActivityThread.main(ActivityThread.java:5221) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:372) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
Caused by: android.database.sqlite.SQLiteException: no such column: film (code 1): , while compiling: SELECT * FROM FILMTABLE WHERE film LIKE ? OR actor LIKE ? OR actor2 LIKE ? OR director LIKE ? 
     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.queryWithFactory(SQLiteDatabase.java:1163) 
     at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1034) 
     at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1202) 
     at com.mnt.filmapp6.MainActivity.search(MainActivity.java:58) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:372) 
            at android.view.View$1.onClick(View.java:4002) 
            at android.view.View.performClick(View.java:4756) 
            at android.view.View$PerformClick.run(View.java:19749) 
            at android.os.Handler.handleCallback(Handler.java:739) 
            at android.os.Handler.dispatchMessage(Handler.java:95) 
            at android.os.Looper.loop(Looper.java:135) 
            at android.app.ActivityThread.main(ActivityThread.java:5221) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:372) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 

ответ

3

Ошибка здесь:

db.execSQL("CREATE TABLE " + TABLE_NAME + " (" + 
ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
      FILM + "TEXT NOT NULL, " + 
       ACTOR + "TEXT NOT NULL, " + 
       ACTOR2 + "TEXT NOT NULL, " + 
       DIRECTOR + "TEXT NOT NULL, " + 
       DESCRIPTION + "TEXT NOT NULL);" 
); 

Это должно быть так:

db.execSQL("CREATE TABLE " + TABLE_NAME + " (" + 
ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
      FILM + " TEXT NOT NULL, " + 
       ACTOR + " TEXT NOT NULL, " + 
       ACTOR2 + " TEXT NOT NULL, " + 
       DIRECTOR + " TEXT NOT NULL, " + 
       DESCRIPTION + " TEXT NOT NULL);" 
); 
+0

Я использовал ваш код, но я все еще получаю ту же ошибку. – MNT

+0

@MNT Поскольку 'onCreate' не вызывается до тех пор, пока у вас есть старый файл базы данных. –

+0

Да, попробуйте воссоздать базу данных (удалите старый и используйте этот новый код для создания нового). – miselking

1

Вызванный: android.database.sqlite.SQLiteException: нет такой колонки: пленка (код 1):, в то время компиляции: SELECT * FROM FILMTABLE Где фильм LIKE? ИЛИ актер КАК? ИЛИ actor2 LIKE? ИЛИ режиссер КАК?

Проверьте таблицу базы данных FILMTABLE для film column. Я думаю, что film столбец не присутствует в вашей таблице базы данных или синтаксис SQL неверен.

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

0
Caused by: android.database.sqlite.SQLiteException: no such column: film (code 1): , while compiling: SELECT * FROM FILMTABLE WHERE film LIKE ? OR actor LIKE ? OR actor2 LIKE ? OR director LIKE ? 

Проверьте таблицу и SQL Синтаксис для film столбца.

Перед публикацией в разделе Переполнение стека, пожалуйста, дайте подробный анализ Logs.

+0

я сделал, но не могу найти проблему в коде, размещенных выше. – MNT

+0

Ваша фактическая проблема была устранена @miselking. Пожалуйста, детально рассмотрите его ответ. –

+0

Я использовал этот код, но я все равно получаю ту же ошибку. – MNT