2014-06-24 30 views
-1

我有一個奇怪的問題需要解決。系統正確調用了SQLiteOpenHelper的onCreate()方法,並且它似乎也是db.execSQL(sql)成功,但該表從未創建。即使db.execSQL(sql)執行沒有錯誤也沒有這樣的表

我使用「adb設備」訪問虛擬機>> cd進入/ data/data/package/databases >> sqlite3運行.tables。如果我執行「select * from posts」,結果是「沒有這樣的表」。感謝您的任何指導。

EDITED

我加在MainActivity類表示我打電話.getWritableDatabase()。當我這樣做時,我可以看到onCreate方法被調用並且沒有任何錯誤,但是當我檢查表是否存在時...不是。

DatabaseHelper.java

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

import java.util.ArrayList; 

public class DatabaseHelper extends SQLiteOpenHelper { 

    private static final String TAG = "DnDa"; 

    public static final String DATABASE_NAME = "db-rss.db"; 
    public static final int DATABASE_VERSION = 1; 
    public static final String DATABASE_TABLE = "posts"; 
    public static final String COLUMN_ID = "_id"; 
    public static final String COLUMN_TITLE = "title"; 
    public static final String COLUMN_LINK = "link"; 
    public static final String COLUMN_DESCRIPTION = "description"; 
    public static final String COLUMN_PUBDATE = "pubdate"; 
    public static final String COLUMN_CATEGORY = "category"; 
    public static final String COLUMN_GUID = "guid"; 

    private Post post; 
    private ArrayList<Post> posts; 
    private Cursor cursor; 

    /** 
    * constructor 
    * @param context 
    */ 
    public DatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) throws SQLiteException { 
     String sql = String.format("CREATE TABLE %s (%s INTEGER PRIMARY KEY AUTOINCREMENT, %s TEXT, %s TEXT, %s TEXT, %s TEXT, %s TEXT, %s TEXT)", 
       DATABASE_TABLE, COLUMN_ID, COLUMN_TITLE, COLUMN_LINK, COLUMN_DESCRIPTION, COLUMN_PUBDATE, COLUMN_CATEGORY, COLUMN_GUID); 

     try { 
      db.execSQL(sql); 
      Log.d(TAG, "Successfully created table: " + sql); 
     } catch (SQLiteException e) { 
      e.printStackTrace(); 
     } 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     String sql = "DROP TABLE IF EXISTS" + DATABASE_TABLE; 
     db.execSQL(sql); 

     this.onCreate(db); 
    } 

    @Override 
    public void onOpen(SQLiteDatabase db) { 
     super.onOpen(db); 
     Log.d(TAG, "Opening database"); 
    } 

    /** 
    * Retrieve all records 
    */ 
    public Cursor getAllRecords(SQLiteDatabase db) { 
     db = this.getReadableDatabase(); 
     cursor = db.query(DATABASE_TABLE, new String[] {COLUMN_TITLE, COLUMN_PUBDATE, COLUMN_DESCRIPTION}, null, null, null, null, null); 
     return cursor; 
    } 

} 

MainActivity.java

public class MainActivity extends ActionBarActivity { 
    private static final String TAG = "DnDa"; 

    private String finalUri = "http://wordpress.com/feed/"; 
    private DatabaseHelper databaseHelper; 
    private SQLiteDatabase database; 
    private Post post; 
    private ArrayList posts; 
    private ScrollView scrollView; 
    private ListView listView; 
    private SimpleCursorAdapter dataAdapter; 

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

     databaseHelper = new DatabaseHelper(this); 
     database = databaseHelper.getWritableDatabase(); 
    } 


} 
+0

這不是你如何創建表格。試試這樣 - >「create table」+ DATABASE_TABLE +「(」+ COLUMN_ID +「INTEGER PRIMARY KEY,」等等。 – Aradhna

+0

出於好奇,爲什麼有人將這個問題標記爲負數?我問一個愚蠢的問題在發佈我的問題之前,我在Google上搜索了很多解決方案, – fergatron

+0

在發佈問題時,您必須具體說明您的問題,您應該發佈代碼以及錯誤信息或logcat幫助他人回答您的問題。如果你提供了正確和完整的信息,那麼只有有人能夠正確地幫助你 – Aradhna

回答

1

不幸的是你的表是不是created.try這個SQL Create Table命令

String sql = "CREATE TABLE "+DATABASE_TABLE+" ("+ 
    COLUMN_ID+" INTEGER PRIMARY KEY AUTOINCREMENT,"+ 
    COLUMN_TITLE+" TEXT,"+ 
    COLUMN_LINK+" TEXT,"+ 
    COLUMN_DESCRIPTION+" TEXT,"+ 
    COLUMN_PUBDATE+" TEXT,"+ 
    COLUMNCOLUMN_CATEGORY+" TEXT,"+ 
    COLUMN_GUID+" TEXT)" 

db.execSQL(sql); 
+0

我嘗試了兩種方法來創建sql語句(String和String.format).execSQL()方法似乎運行得很好,因爲它沒有' t給我一個錯誤,但是這個表是從來沒有創建的 – fergatron

0

待辦事項您在DatabaseHelper對象上致電getWritableDatabase()?可能你有這樣的problem

== ==編輯

我在Activity做了一個項目,你DatabaseHelper和驗證碼:

DatabaseHelper mOpenHelper = new DatabaseHelper(this); 
SQLiteDatabase db = mOpenHelper.getWritableDatabase(); 

Cursor с = mOpenHelper.getAllRecords(db); 

的偉大工程,光標包含三列,沒有例外。

+0

知道代碼的工作原理是很好的,我確實調用了getWritableDatabase方法,但沒有創建表。是否需要指定數據庫名? – fergatron

0

好的;我覺得自己像個傻瓜。每次執行代碼時都成功創建表。問題是我跑了「sqlite3」而沒有指定數據庫。現在我正在管理正確的數據庫,我可以看到表格在那裏。

http://developer.android.com/tools/help/sqlite3.html

sqlite3 /data/data/<package>/databases/<database-name>.db 

再次感謝你的貢獻和測試我的代碼。