2011-11-12 102 views
1

对不起,如果我重复我的问题,但我仍然没有线索做什么以及如何处理这个问题。如何保存/从SQlite数据库中检索单词?

我的应用程序是一本字典。我假设用户需要将他们想要记忆的单词添加到收藏夹列表中。因此,我创建了一个收藏夹按钮上两个阶段的工作:

  • 短点击当前视图字保存到收藏夹列表;
  • 并长按可查看收藏夹列表,以便用户可以单击任何单词再次查看它们。

我去使用SQlite数据库来存储最喜欢的单词,但我不知道我该怎么做这个任务。具体来说,我的问题是:

  1. 我应该使用当前字典SQLite数据库还是创建一个新的SQLite数据库收藏单词?
  2. 在每种情况下,我需要编写哪些代码才能处理上述任务?

有没有人可以帮忙?

这里是字典代码:


package mydict.app; 

import java.util.ArrayList; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteException; 
import android.util.Log; 

public class DictionaryEngine { 
static final private String SQL_TAG = "[MyAppName - DictionaryEngine]"; 

private SQLiteDatabase mDB = null; 

private String mDBName; 
private String mDBPath; 
//private String mDBExtension; 
public ArrayList<String> lstCurrentWord = null; 
public ArrayList<String> lstCurrentContent = null; 
//public ArrayAdapter<String> adapter = null; 

public DictionaryEngine() 
{ 
    lstCurrentContent = new ArrayList<String>(); 
    lstCurrentWord = new ArrayList<String>(); 
} 

public DictionaryEngine(String basePath, String dbName, String dbExtension) 
{ 
    //mDBExtension = getResources().getString(R.string.dbExtension); 
    //mDBExtension = dbExtension; 
    lstCurrentContent = new ArrayList<String>(); 
    lstCurrentWord = new ArrayList<String>(); 

    this.setDatabaseFile(basePath, dbName, dbExtension); 
} 

public boolean setDatabaseFile(String basePath, String dbName, String dbExtension) 
{ 
    if (mDB != null) 
    { 
     if (mDB.isOpen() == true) // Database is already opened 
     { 
      if (basePath.equals(mDBPath) && dbName.equals(mDBName)) // the opened database has the same name and path -> do nothing 
      { 
       Log.i(SQL_TAG, "Database is already opened!"); 
       return true; 
      } 
      else 
      { 
       mDB.close(); 
      } 
     } 
    } 

    String fullDbPath=""; 

    try 
    { 
     fullDbPath = basePath + dbName + "/" + dbName + dbExtension; 
     mDB = SQLiteDatabase.openDatabase(fullDbPath, null, SQLiteDatabase.OPEN_READWRITE|SQLiteDatabase.NO_LOCALIZED_COLLATORS); 
    } 
    catch (SQLiteException ex) 
    { 
     ex.printStackTrace(); 
     Log.i(SQL_TAG, "There is no valid dictionary database " + dbName +" at path " + basePath); 
     return false; 
    } 

    if (mDB == null) 
    { 
     return false; 
    } 

    this.mDBName = dbName; 
    this.mDBPath = basePath; 

    Log.i(SQL_TAG,"Database " + dbName + " is opened!"); 

    return true; 
} 

public void getWordList(String word) 
{ 
    String query; 
    // encode input 
    String wordEncode = Utility.encodeContent(word); 

    if (word.equals("") || word == null) 
    { 
     query = "SELECT id,word FROM " + mDBName + " LIMIT 0,15" ; 
    } 
    else 
    { 
     query = "SELECT id,word FROM " + mDBName + " WHERE word >= '"+wordEncode+"' LIMIT 0,15"; 
    } 
    //Log.i(SQL_TAG, "query = " + query); 

    Cursor result = mDB.rawQuery(query,null); 

    int indexWordColumn = result.getColumnIndex("Word"); 
    int indexContentColumn = result.getColumnIndex("Content"); 

    if (result != null) 
    { 
     int countRow=result.getCount(); 
     Log.i(SQL_TAG, "countRow = " + countRow); 
     lstCurrentWord.clear(); 
     lstCurrentContent.clear(); 
     if (countRow >= 1) 
     { 
      result.moveToFirst(); 
      String strWord = Utility.decodeContent(result.getString(indexWordColumn)); 
      String strContent = Utility.decodeContent(result.getString(indexContentColumn)); 
      lstCurrentWord.add(0,strWord); 
      lstCurrentContent.add(0,strContent); 
      int i = 0; 
      while (result.moveToNext()) 
      { 
       strWord = Utility.decodeContent(result.getString(indexWordColumn)); 
       strContent = Utility.decodeContent(result.getString(indexContentColumn)); 
       lstCurrentWord.add(i,strWord); 
       lstCurrentContent.add(i,strContent); 
       i++; 
      } 

     } 

     result.close(); 
    } 

} 

public Cursor getCursorWordList(String word) 
{ 
    String query; 
    // encode input 
    String wordEncode = Utility.encodeContent(word); 

    if (word.equals("") || word == null) 
    { 
     query = "SELECT id,word FROM " + mDBName + " LIMIT 0,15" ; 
    } 
    else 
    { 
     query = "SELECT id,content,word FROM " + mDBName + " WHERE word >= '"+wordEncode+"' LIMIT 0,15"; 
    } 
    //Log.i(SQL_TAG, "query = " + query); 

    Cursor result = mDB.rawQuery(query,null); 

    return result;  
} 

public Cursor getCursorContentFromId(int wordId) 
{ 
    String query; 
    // encode input 
    if (wordId <= 0) 
    { 
     return null; 
    } 
    else 
    { 
     query = "SELECT id,content,word FROM " + mDBName + " WHERE Id = " + wordId ; 
    } 
    //Log.i(SQL_TAG, "query = " + query); 
    Cursor result = mDB.rawQuery(query,null); 

    return result;  
} 

public Cursor getCursorContentFromWord(String word) 
{ 
    String query; 
    // encode input 
    if (word == null || word.equals("")) 
    { 
     return null; 
    } 
    else 
    { 
     query = "SELECT id,content,word FROM " + mDBName + " WHERE word = '" + word + "' LIMIT 0,1"; 
    } 
    //Log.i(SQL_TAG, "query = " + query); 

    Cursor result = mDB.rawQuery(query,null); 

    return result;  
} 

public void closeDatabase() 
{ 
    mDB.close(); 
} 

public boolean isOpen() 
{ 
    return mDB.isOpen(); 
} 

public boolean isReadOnly() 
{ 
    return mDB.isReadOnly(); 
} 

} 

这里是收藏夹按钮下面的代码保存并加载收藏夹列表:


btnAddFavourite = (ImageButton) findViewById(R.id.btnAddFavourite); 
btnAddFavourite.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // Add code here to save the favourite, e.g. in the db. 
       Toast toast = Toast.makeText(ContentView.this, R.string.messageWordAddedToFarvourite, Toast.LENGTH_SHORT); 
       toast.show(); 
      } 
     }); 

    btnAddFavourite.setOnLongClickListener(new View.OnLongClickListener() { 

      @Override 
      public boolean onLongClick(View v) { 

       // Open the favourite Activity, which in turn will fetch the saved favourites, to show them. 
       Intent intent = new Intent(getApplicationContext(), FavViewFavourite.class); 
       intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       getApplicationContext().startActivity(intent); 

       return false; 
      } 
     }); 
} 
+1

你并不需要创建一个新的数据库,在我看来,你只需要两个查询,一个获取所有的最爱形成收藏表,一个将喜爱的东西保存到桌子上。 –

+0

我强烈建议你在android中使用DBAdaptor。链接:http://www.devx.com/wireless/Article/40842/0/page/1 –

+0

非常感谢。我会尽力为你们提示。 –

回答

1

您需要有两张桌子

  1. 收藏

字(ID,词,意义,...)

收藏夹(ID,word_id)

在收藏表中有一个外键点单词表中的单词。

我只解决了您需要构建表格的方式。

* EDITED *

words(id, name, meaning, timestamp) 
favortie(id, word_id) 
+1

@ user998032您只需要一个包含两个表的Harsha M V建议的数据库。 – wannik

+0

非常感谢。这就是我一直在想的。但我需要一个例子来跟随。你能帮我吗? –

+0

分享你现在的桌子我会修改你的桌子 –