2016-04-28 16 views
0

Beim Ausführen der Anwendung bekomme ich über Fehler obwohl ich überprüft die SQLite-Datei und es enthält die Watchlist-Tabelle, obwohl die Tabelle keine Einträge hat.android.database.sqlite.SQLiteException: keine solche Tabelle:

DBAdapter.java

package hp.vamazon; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

public class DBAdapter { 

    private static final String TAG = "DBAdapter"; //used for logging database version changes 

    // Field Names: 
    public static final String bookID = "bookid";//==KEYROW_ID 
    public static final String bookName = "bookname";//==KEY_TASK 
    public static final String bookPrice = "bbp";//==KEY_DATE 
    public static final String storeName = "storename"; 

    public static final String[] ALL_KEYS = new String[] {bookID,bookPrice,bookName,storeName}; 

    // Column Numbers for each Field Name: 
    public static final int COL_ROWID = 0; 
    public static final int COL_TASK = 1; 
    public static final int COL_DATE = 2; 
    public static final int COL_STORE = 3; 

    // DataBase info: 
    public static final String DATABASE_NAME = "bookstore"; 
    public static final String DATABASE_TABLE = "watchlist"; 
    public static final int DATABASE_VERSION = 2; // The version number must be incremented each time a change to DB structure occurs. 

    //SQL statement to create database 
    private static final String DATABASE_CREATE_SQL = 
      "CREATE TABLE " + DATABASE_TABLE 
      + " (" + bookID + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
      + bookName + " TEXT NOT NULL, " 
      + bookPrice + " TEXT, " 
      + bookPrice + " TEXT " 
      + ");"; 

    private final Context context; 
    private DatabaseHelper myDBHelper; 
    private SQLiteDatabase db; 


    public DBAdapter(Context ctx) { 
     this.context = ctx; 
     myDBHelper = new DatabaseHelper(context); 
    } 

    // Open the database connection. 
    public DBAdapter open() { 
     db = myDBHelper.getWritableDatabase(); 
     return this; 
    } 

    // Close the database connection. 
    public void close() { 
     myDBHelper.close(); 
    } 

    // Add a new set of values to be inserted into the database. 
    public long insertRow(String bookname, String price,String id ,String store) { 
     ContentValues initialValues = new ContentValues(); 
     initialValues.put(bookID,id); 
     initialValues.put(bookPrice,price); 
     initialValues.put(bookName,bookname); 
     initialValues.put(storeName,store); 
     // Insert the data into the database. 
     return db.insert(DATABASE_TABLE, null, initialValues); 
    } 

    // Delete a row from the database, by rowId (primary key) 
    public boolean deleteRow(long rowId) { 
     String where = bookID + "=" + rowId; 
     return db.delete(DATABASE_TABLE, where, null) != 0; 
    } 

    public void deleteAll() { 
     Cursor c = getAllRows(); 
     long rowId = c.getColumnIndexOrThrow(bookID); 
     if (c.moveToFirst()) { 
      do { 
       deleteRow(c.getLong((int) rowId));    
      } while (c.moveToNext()); 
     } 
     c.close(); 
    } 

    // Return all data in the database. 
    public Cursor getAllRows() { 
     String where = null; 
     Cursor c = db.query(true, DATABASE_TABLE, ALL_KEYS, where, null, null, null, null, null); 
     if (c != null) { 
      c.moveToFirst(); 
     } 
     return c; 
    } 

    // Get a specific row (by rowId) 
    public Cursor getRow(long rowId) { 
     String where = bookID + "=" + rowId; 
     Cursor c = db.query(true, DATABASE_TABLE, ALL_KEYS, 
         where, null, null, null, null, null); 
     if (c != null) { 
      c.moveToFirst(); 
     } 
     return c; 
    } 

    // Change an existing row to be equal to new data. 
    public boolean updateRow(long rowId, String task, String date) { 
     String where = bookID + "=" + rowId; 
     ContentValues newValues = new ContentValues(); 
     newValues.put(bookName, task); 
     newValues.put(bookPrice, date); 
     // Insert it into the database. 
     return db.update(DATABASE_TABLE, newValues, where, null) != 0; 
    } 


    private static class DatabaseHelper extends SQLiteOpenHelper 
    { 
     DatabaseHelper(Context context) { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase _db) { 


db.execSQL(DATABASE_CREATE_SQL); 
     } 

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


} 

Watchlist.java

package hp.vamazon; 

import java.sql.SQLException; 
import java.util.ArrayList; 
import java.util.List; 

import android.app.Activity; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.support.v4.widget.SimpleCursorAdapter; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.AdapterView;  
import android.widget.ListView; 

public class Watchlist extends Activity { 


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

     openDb(); 
     populatListViewFromDB(); 
    } 
    private void openDb() { 
     myDb=new DBAdapter(this); 
     myDb.open();   
    } 

    private void populatListViewFromDB() { 


     Cursor cursor=myDb.getAllRows(); 

     startManagingCursor(cursor); 

     String []fromFieldNames=new String[]{DBAdapter.bookName,DBAdapter.bookPrice,DBAdapter.storeName}; 
     int []toViewIDs=new int[]{R.id.item_name,R.id.item_price,R.id.item_store}; 

     SimpleCursorAdapter myCursorAdapter=new SimpleCursorAdapter(this,R.layout.cartitem_view 
       ,cursor,fromFieldNames,toViewIDs); 


     ListView myList=(ListView)findViewById(R.id.listView1); 
     myList.setAdapter(myCursorAdapter); 

    } 
    private void registerClickCallback() 
    { 
     ListView myList=(ListView)findViewById(R.id.listView1); 
     myList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Cursor cursor=myDb.getRow(id); 
      if(cursor.moveToFirst()) 
      { 
       myDb.deleteRow(id); 
       populatListViewFromDB(); 
      } 
      cursor.close(); 
      } 
     }); 
    } 

} 

bei hp.vamazon.DBAdapter.getAllRows (DBAdapter.java:93)
bei hp.vamazon.Watchlist.populatListViewFromDB (Watchlist.java:37)

+0

Ich löste die Frage selbst obwohl danke für Ihre Bemühungen Jungs. Das Problem war, dass ich keine neue Instanz der SQLite-Datenbank in jeder Funktion definierte, die dazu führte, dass der Code keine Datenbankausnahme verursachte, da wir keine Datenbank hatten, wie sie ist. –

Antwort

2

Ihre Klasse, die SQLiteOpenHelper erweitert, sollte den Befehl sql in onCreate Methode zu c ausführen reate den Tisch, wie

@Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL(DATABASE_CREATE_SQL); 
} 

ja ist es für sicher, dass Sie Befehl als final String DATABASE_CREATE_SQL erstellt haben Tabelle zu erstellen, aber vergessen zu execute dies so, dass Tabelle nicht erstellt. Damit Sie bemerken, dass Ihre Methoden onCreate und onUpgrade leer sind.

Siehe here wie DatabaseHelper erstellt von erweitern SQLiteOpenHelper.

+0

Auch nach dem Hinzufügen der obigen Zeile in der onCreate() -Methode und dem Löschen der Tabelle, falls vorhanden, und dem Aufruf von onCreate() in onUpdate(), zeigt der Code die gleichen Fehler. –

+0

die sqlite Datenbank in meiner Anwendung enthält bereits die Tabelle (überprüft von sqlite browser) obwohl die Tabelle leer ist –

+0

Bro, es tut mir wirklich leid, dass ich für zwei Tage in Urlaub bin und derzeit weit weg von meinem Arbeitsbereich ... Aber es ist sicher, dass Ihre Tabelle nicht erstellt wird, egal .. –

0

android.database.sqlite.SQLiteException: keine solche Tabelle

Auf Ihrem Fall dieses ocurring, weil Sie keine Tabelle erstellt haben. Auf Ihrer DatabaseHelper sollten Sie die onCreate() einschließen.

Aus der Dokumentation:

aufgerufen, wenn die Datenbank zum ersten Mal erstellt wird. Hier sollte die Erstellung von Tabellen und die anfängliche Population der Tabellen erfolgen.

Sie sollten die Tabellen dort wie folgt erstellen:

db.execSQL(DATABASE_CREATE_SQL); //It will create the table 
+0

die SQLite-Datenbank in meiner Anwendung enthält bereits die Tabelle (überprüft von sqlite Browser), obwohl die Tabelle leer ist –

+0

@vibhorvaish Gelöst Ihr Problem? –

0

Sie haben keinen Code in OnCreate und ONUPGRADE Methode, die in DatabaseHelper Klasse. Zuerst Sie müssen ExecSQL Befehl erstellen Tabelle auszuführen:

@Override 
     public void onCreate(SQLiteDatabase _db) {  
_db.execSQL(DATABASE_CREATE_SQL); 
     } 

Und für ONUPGRADE Methode refer folgenden Code:

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

     String Query = "DROP TABLE IF EXISTS Your_Table_Name" 
     _db.execSQL(Query); 
     onCreate(_db); 

       } 
+0

auch nach dem Hinzufügen der obigen Zeile in der onCreate() -Methode und das Löschen der Tabelle, wenn vorhanden und OnCreate() innerhalb onUpdate() aufrufen, zeigt der Code die gleichen Fehler. –

+0

Die SQLite-Datenbank in meiner Anwendung enthält bereits die Tabelle (überprüft von SQLite-Browser), obwohl die Tabelle leer ist. –

0

Ich löste die Frage mich, obwohl Dank für Ihre Bemühungen Jungs. Das Problem war, dass ich keine neue Instanz der SQLite-Datenbank in jeder Funktion definierte, die dazu führte, dass der Code keine Datenbankausnahme verursachte, da wir keine Datenbank hatten, wie sie ist.

Verwandte Themen