2013-06-19 112 views
1

SQLiteDatabase发生异常db = this.getWritableDatabase(); 与我的数据库处理器提供了一流为什么我在this.getWritableDatabase(),android?上得到nullpointer异常?

public class DatabaseHandler extends SQLiteOpenHelper { 

    // All Static variables 
    // Database Version 
    private static final int DATABASE_VERSION = 1; 


    // Database Name 
    private static final String DATABASE_NAME = "chat"; 

    // Contacts table name 
    private static final String TABLE_CHAT = "chat_history"; 

    // Contacts Table Columns names 
    private static final String KEY_ID = "id"; 
    private static final String KEY_TT = "tt"; 
    private static final String KEY_TYPE = "type"; 
    private static final String KEY_MSG = "message"; 

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

    // Creating Tables 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String CREATE_CHAT_TABLE = "CREATE TABLE " + TABLE_CHAT + "(" 
      + KEY_ID + " INTEGER PRIMARY KEY," + KEY_TT + " TEXT," + KEY_TYPE + " TEXT," 
      + KEY_MSG + " TEXT" + ")"; 
     db.execSQL(CREATE_CHAT_TABLE); 
    } 

    // Upgrading database 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // Drop older table if existed 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_CHAT); 

     // Create tables again 
     onCreate(db); 
    } 

    // Adding new contact 

    public void addContact(String tt, String type, String msg) { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     System.out.println("tt "+tt); 
     System.out.println("msg "+msg); 
     System.out.println("type "+type); 
     ContentValues values = new ContentValues(); 
     values.put(KEY_TT, tt); // Contact Name 
     values.put(KEY_TYPE, type); // Contact Phone Number 
     values.put(KEY_MSG, msg); 

     // Inserting Row 
     db.insert(TABLE_CHAT, null, values); 
     db.close(); // Closing database connection 
    } 

    // Getting All Contacts 
    public List<ChatHistory> getAllContacts(String T) { 
     List<ChatHistory> contactList = new ArrayList<ChatHistory>(); 
     // Select All Query 
     System.out.println("database T$$$$$$$$$$$"+T); 

     String selectQuery = "SELECT * FROM " + TABLE_CHAT + " WHERE "+ KEY_TT+"="+"'"+T+"'"; 

     SQLiteDatabase db = this.getWritableDatabase(); 
     Cursor cursor = db.rawQuery(selectQuery, null); 

     // looping through all rows and adding to list 
     if (cursor.moveToFirst()) { 
      do { 
       ChatHistory chatHistory = new ChatHistory(); 
      chatHistory.setID(Integer.parseInt(cursor.getString(0))); 
       chatHistory.settt(cursor.getString(1)); 
      chatHistory.settype(cursor.getString(2)); 
      chatHistory.setmsg(cursor.getString(3)); 
       // Adding contact to list 
       contactList.add(chatHistory); 
      } while (cursor.moveToNext()); 
     } 

     // return contact list 
     return contactList; 
    } 
} 

我一直在这条线 SQLiteDatabase DB = this.getWritableDatabase越来越异常();

其空指针异常.. 我无法解决问题。 请提出解决方案 这是上下文的一些错误 如何解决它?

+0

也许数据库名称是不完整的。尝试改变做“chat.dat”(与文件结尾)..它解决了问题吗? – Opiatefuchs

+0

只是为了澄清...你的getWritableDatabase()方法在哪里? –

+1

他/她指的是[SQLiteOpenHelper.getWritableDatabase()](http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#getWritableDatabase())。你有没有试图获得你得到的NullPointerException的栈跟踪? 'try {/ * problem code * /} catch(Exception e){e.printStackTrace();/*或者你可以记录堆栈跟踪* /}' – ADTC

回答

0

不要在您的DatabaseHandler类中执行查询相关的工作。保留它仅用于开放,关闭,升级,创建相关工作。使用带有显式异常的synchronized方法调用。

为线索,尝试这样的:

/** 
    * open the db 
    * @return this 
    * @throws SQLException 
    * return type: DatabaseHandler 
    */ 
    public synchronized DatabaseHandler open() throws SQLException 
    { 
     if(db == null || !db.isOpen()) 
      this.db = getWritableDatabase(); 
     return this; 
    } 

然后你rawquery定义方法返回Cursor对象:

public synchronized Cursor rawQuery(String sql, String[] args) throws SQLException{ 
     if(db == null || !db.isOpen()) 
      this.open(); 
     return db.rawQuery(sql, args); 
    } 

然后在你的类要执行相关工作的选择查询做:

protected DatabaseHandler dbHandler; 
dbHandler = DatabaseHandler.getInstance(activity.getApplicationContext()); 
String selectQuery = "SELECT * FROM " + TABLE_CHAT + " WHERE "+ KEY_TT+"="+"'"+T+"'"; 
Cursor r = dbHandler.rawQuery(selectQuery, null); 

相关的循环代码会在它下面。

希望它会帮助!

-1

我想和记住,我不是专家,你正在使用SQLiteopenhelper类比它更多的是实习。我相信它应该只扩展到“帮助类管理数据库创建和版本管理”。
所以我建议创建一个独立的类,它使用你的数据库处理程序类来获取你的可写数据库,并把数据库操作的方法放在那里。
沿着同样的路线,您可以制作建议的课程,但将您当前的课程作为内部课程放入其中。 (只要确保给CRUD方法迁移到新的CLAS

+1

它不回答这个问题;) – mithrop

0

而不是创造的addContact方法的数据库对象,在数据库处理器类的onCreate方法创建它,

public class DatabaseHandler extends SQLiteOpenHelper { 

    SQLiteDatabase db ; 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     //write you code here.. 
     this.db=db; 

     } 


} 
1

我认为你的数据库中有没有因为你正在执行错误的查询创建你忘了在最后加一个分号

什么你正在做的是:

String CREATE_CHAT_TABLE = "CREATE TABLE " + TABLE_CHAT + "(" 
     + KEY_ID + " INTEGER PRIMARY KEY," + KEY_TT + " TEXT," + KEY_TYPE + " TEXT," 
     + KEY_MSG + " TEXT" + ")"; 

使用取而代之的是

String CREATE_CHAT_TABLE = "CREATE TABLE " + TABLE_CHAT + "(" 
     + KEY_ID + " INTEGER PRIMARY KEY," + KEY_TT + " TEXT," + KEY_TYPE + " TEXT," 
     + KEY_MSG + " TEXT" + ");"; 

然后卸载您的应用程序,然后重试。

+0

这不是问题bt仍然thnx – Wishy

1

这个问题的两个可能的原因,他们都主要是因为onCreate或onUpgrade内的代码的正确使用。

1)验证您的SQL查询,在这两种方法的OnCreate和onUpgrade(你可以运行,并通过SQLiteBrowser

2验证使用任何一个虚拟测试SQLite数据库您的书面查询),请确保您使用的方法一样以下(不使用外部SQLiteDatabase对象,如果你有,只是使用的内部和传递的一个)

public class SqliteHelper extends SQLiteOpenHelper{ 
    SQLiteDatabase dbHelper; 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL("YOUR CREATE QUERY"); //don't use dbHelper here 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db) { 
     db.execSQL("YOUR UPGRADE QUERY"); //don't use dbHelper here 
    } 

    public void open() throws SQLExceptions { 
     dbHelper = this.getWritableDatabase(); 
    } 

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

    public long insert(...){ 
     open(); 
     //your access is here through dbHelper 
     close(); 
    } 

} 
1

如果您使用的片段初始化内部onCreate View的上下文

DbProgram dbProgram; 
    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {  
     View view = inflater.inflate(R.layout.activity_main, container, false); 
     **dbProgram = new DbProgram(getActivity());** // Context here solves your problem............ 
     return view; 
    } 

如果你不使用片段初始化contextonCreate方法

MarketAppDbAdapter db; 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     **db = new MarketAppDbAdapter(MainActivity.this);**// Your problem solves here........... 
    } 
相关问题