2013-10-23 150 views
0

我正在构建一个应用程序,该应用程序显示ListFragment中的项目。现在每个项目都显示标题和创建日期。还有两个片段。一个创建一个项目,并有一个EditText字段,我可以编辑标题。另一个只是显示单个项目的内容。Android错误onTextChanged更新sqlite数据库

我遇到的问题是每当我在应用程序关闭的EditText字段中输入字符时。错误消息表明错误发生在TextChangedListener中的onTextChanged上。由于我在将所有内容作为JSON文件存储时都有此功能,因此我必须更新数据库并更新模型层。

该文件执行所有数据库操作并创建自定义光标。

public class SnapDatabaseHelper extends SQLiteOpenHelper { 
private static final String TAG = "FeedFragment"; 

private static final String DB_NAME = "snap.sqlite"; 
private static final int VERSION = 1; 

private static final String TABLE_SNAP = "snap"; 

private static final String COLUMN_SNAP_ID = "_id"; 
private static final String COLUMN_SNAP_DATE = "snap_date"; 
private static final String COLUMN_SNAP_UUID = "snap_uuid"; 
private static final String COLUMN_SNAP_TITLE = "snap_title"; 

public SnapDatabaseHelper(Context context){ 
    super(context, DB_NAME, null, VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    // Create SNAP table 
    db.execSQL("create table snap(" + 
    "_id integer primary key autoincrement, " + 
    //"snap_uuid text, " + 
    "snap_date integer, " + 
    "snap_title text) "); 
} 

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

public long insertSnap(Snap snap){ 
    ContentValues cv = new ContentValues(); 
    //cv.put(COLUMN_SNAP_UUID, snap.getUniqueId().toString()); 
    cv.put(COLUMN_SNAP_DATE, snap.getDate().getTime()); 
    cv.put(COLUMN_SNAP_TITLE, ""); 
    return getWritableDatabase().insert(TABLE_SNAP, null, cv); 

} 
public boolean updateTitle(long snapId, String text) 
{ 
ContentValues cv = new ContentValues(); 
cv.put(COLUMN_SNAP_ID, snapId);   
cv.put(COLUMN_SNAP_TITLE, text); 

int i= getWritableDatabase().update(TABLE_SNAP, cv, COLUMN_SNAP_ID+ "=" + snapId, null); 
return i>0; 
} 
public SnapCursor querySnap(long id) { 
     Cursor wrapped = getReadableDatabase().query(TABLE_SNAP, 
       null, // all columns 
       COLUMN_SNAP_ID + " = ?", // look for a run ID 
       new String[]{ String.valueOf(id) }, // with this value 
       null, // group by 
       null, // order by 
       null, // having 
       "1"); // limit 1 row 
     return new SnapCursor(wrapped); 
} 
public SnapCursor querySnaps() { 
     // equivalent to "select * from run order by start_date asc" 
     Cursor wrapped = getReadableDatabase().query(TABLE_SNAP, 
       null, null, null, null, null, COLUMN_SNAP_DATE + " asc"); 
     return new SnapCursor(wrapped); 
    } 

public static class SnapCursor extends CursorWrapper{ 
    public SnapCursor(Cursor c){ 
     super(c); 
    } 
    public Snap getSnap() { 
     if (isBeforeFirst() || isAfterLast()) 
      return null; 

     Snap s = new Snap(); 
     s.setId(getLong(getColumnIndex(COLUMN_SNAP_ID))); 
     //s.setUniqueId(UUID(getString(getColumnIndex(COLUMN_SNAP_UUID)))); 
     s.setDate(new Date(getLong(getColumnIndex(COLUMN_SNAP_DATE)))); 
     s.setTitle(getString(getColumnIndex(COLUMN_SNAP_TITLE))); 
     return s; 
    } 
} 

} 

该文件将片段链接到DatabaseHelper。

public class SnapLab { 

private static SnapLab sSnapLab; 
private Context mAppContext; 
private SnapDatabaseHelper mHelper; 

// private constructor 
private SnapLab(Context appContext){ 
    mAppContext = appContext; 
    mHelper = new SnapDatabaseHelper(mAppContext); 
} 
public static SnapLab get(Context c){ 
    if(sSnapLab == null){ 
     sSnapLab = new SnapLab(c.getApplicationContext()); 
    } 
    return sSnapLab; 
} 
public Snap insertSnap() { 
    Snap s = new Snap(); 
    s.setId(mHelper.insertSnap(s)); 

    return s; 
} 
public boolean updateTitle(long snapId, String text){ 


    return mHelper.updateTitle(snapId, text); 

} 

public SnapCursor querySnaps() { 
    return mHelper.querySnaps(); 
} 

public Snap getSnap(long id) { 
    Snap s = null; 
    SnapCursor cursor = mHelper.querySnap(id); 
    cursor.moveToFirst(); 
    // if we got a row, get a run 
    if (!cursor.isAfterLast()) 
     s = cursor.getSnap(); 
    cursor.close(); 
    return s; 
} 

} 

这里是与所述的EditText字段

public class EditPageFragment extends Fragment { 
private static final String TAG = "EditPageFragment"; 
public static final String EXTRA_SNAP_ID = "SNAP_ID"; 

private SnapLab mSnapLab; 
private Snap mSnap; 
private SnapDatabaseHelper mHelper; 
private EditText mSnapText; 
private Button mUploadButton; 
private TextView mDateText; 
private Long snapId; 

public static EditPageFragment newInstance(Long snapId){ 
    Bundle args = new Bundle(); 
    args.putLong(EXTRA_SNAP_ID, snapId); 
    EditPageFragment fragment = new EditPageFragment(); 
    fragment.setArguments(args); 
    return fragment; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRetainInstance(true); 
    mSnapLab = SnapLab.get(getActivity()); 

    Bundle args = getArguments(); 
    if (args != null){ 
     long snapId = args.getLong(EXTRA_SNAP_ID, -1); 
     if (snapId != -1){ 
      mSnap = mSnapLab.getSnap(snapId); 
     } 
    } 
    mSnap = new Snap(); 
    mSnap = mSnapLab.insertSnap(); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState){ 
    View v = inflater.inflate(R.layout.edit_fragment, parent, false); 


    mDateText = (TextView)v.findViewById(R.id.edit_dateText); 
    mDateText.setText(mSnap.getDate().toString()); 

    mSnapText = (EditText)v.findViewById(R.id.edit_snapText); 
    mSnapText.addTextChangedListener(new TextWatcher(){ 
     @Override 
     public void afterTextChanged(Editable s) { 
      //leave blank for now 
     } 
     @Override 
     public void beforeTextChanged(CharSequence c, int start, int count, 
       int after) { 
      //leave blank for now 
     } 
     @Override 
     public void onTextChanged(CharSequence c, int start, int before, 
       int count) { 
      mSnap.setTitle(c.toString()); 
      mSnapLab.updateTitle(snapId, c.toString()); 

      Log.i(TAG, "text saved"); 
     } 
    }); 

    return v; 
} 
} 

代码的进口位是给updateTitle()函数的片段。我可能做错了什么。你有关于如何更好地更新数据库的建议。除了标题的更新之外,一切都很好。我很感激任何帮助。

回答

0

貌似snapId未分配

private Long snapId; //field 

几行后

long snapId = args.getLong(EXTRA_SNAP_ID, -1); //local variable 

几行后

mSnapLab.updateTitle(snapId, c.toString()); //field 

请加堆栈跟踪下一次。

+0

好的。谢谢,它确实与没有正确定义snapId有关。 – pdfj