2016-06-30 60 views
0

我做了一个保存笔记的android应用程序。笔记确实被保存了。但是,当应用程序打开时,仅显示示例注释Akhilesh Chobey。所有其他音符都显示在在Main2Activity(活动编辑注)按后退按钮数据库未在第一次打开应用程序时显示

MainActivity:

public class MainActivity extends AppCompatActivity { 

ListView notesListView; 
static ArrayList<String> notesArrayList; 
static ArrayAdapter<String> adapter; 

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

    notesListView = (ListView) findViewById(R.id.notesListView); 
    notesArrayList = new ArrayList<String>(); 

    if(Main2Activity.myDb != null) { 
     notesArrayList.clear(); 
     Cursor res = Main2Activity.myDb.getData(); 
     if (res.getCount() == 0) { 
      Log.i("Error", "error"); 
      return; 
     } 
     while (res.moveToNext()) { 
      notesArrayList.add(res.getString(res.getColumnIndex("text"))); 
     } 
    } 

    notesArrayList.add("Akhilesh Chobey"); 
    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, notesArrayList); 
    notesListView.setAdapter(adapter); 

    notesListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
      Intent intent = new Intent(getApplicationContext(), Main2Activity.class); 
      intent.putExtra("notePosition", i); 
      startActivity(intent); 
     } 
    }); 
} 
} 

Main2Activity:

public class Main2Activity extends AppCompatActivity implements TextWatcher { 

static DatabaseOperations myDb; 
EditText editNote; 
int position; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main2); 
    editNote = (EditText) findViewById(R.id.noteEditText); 

    myDb = new DatabaseOperations(Main2Activity.this); 

    Intent intent = getIntent(); 
    position = intent.getIntExtra("notePosition", -1); 
    if(position != -1){ 

     editNote.setText(MainActivity.notesArrayList.get(position)); 

    } 
    editNote.addTextChangedListener(this); 
} 

@Override 
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

} 

@Override 
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
    if (myDb != null) { 
     boolean isInserted = myDb.insertData(editNote.getText().toString());   


     MainActivity.notesArrayList.set(position, String.valueOf(charSequence)); 
     MainActivity.adapter.notifyDataSetChanged(); 
    } 
} 

数据库助手类:

public class DatabaseOperations extends SQLiteOpenHelper { 

public static final String DatabaseName = "notes.db"; 
public static final String TableName = "notes"; 
public static final String Col1 = "text"; 

public DatabaseOperations(Context context) { 
    super(context, DatabaseName, null, 1); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL("create table " + TableName + " (text TEXT) "); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int i, int i1) { 

    db.execSQL("DROP TABLE IF EXISTS " + TableName); 
    onCreate(db); 

} 

public boolean insertData(String note){ 

    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(Col1, note); 

    long result = db.insert(TableName, null, contentValues); 
    if(result == -1){ 
     return false; 
    }else { 
     return true; 
    } 
} 

public Cursor getData(){ 
    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor result = db.rawQuery("select * from " + TableName, null); 
    return result; 
} 
} 
在Main2Activity类
+1

从其他Activity获取对db helper的引用对我而言,这看起来很奇怪。我认为如果(Main2Activity.myDb!= null){Note:ArrayArray.clear();};}}。游标res = Main2Activity.myDb.getData();游标res = Main2Activity.myDb.getData();游标res = Main2Activity.myDb.getData();如果(res.getCount()== 0){ Log.i(“Error”,“error”); return; } while(res.moveToNext())notesArrayList.add(res.getString(res.getColumnIndex(“text”))); } } 这是问题,db返回null,所以你不加载数据库的日期。 – Rafal

+0

无论如何,我可以使数据库'myDb'“不为空”? –

+2

在Activity1中创建新实例 myDb = new DatabaseOperations(this); – Rafal

回答

1

(可怕的BTW命名)的

static DatabaseOperations myDb;

变量不是在节目的开始与任何分配,所以DatabaseOperations== null,所以如果条件

if(Main2Activity.myDb != null) { 
    notesArrayList.clear(); 
    Cursor res = Main2Activity.myDb.getData(); 
    if (res.getCount() == 0) { 
     Log.i("Error", "error"); 
     return; 
    } 
    while (res.moveToNext()) { 
     notesArrayList.add(res.getString(res.getColumnIndex("text"))); 
    } 
} 

将不会执行,因此没有数据将被加载到应用程序中。 当你从M2A类背按回 的onCreate被再次呼吁,但这次,因为MYDB分配这个值,

myDb = new DatabaseOperations(Main2Activity.this); 所以如果在MainActivity类别条件为真。

你需要做什么:找到一种方法,使myDb变量在程序开始时不为空。

+0

谢谢。是的,我同意,可怕的命名。但我想不出有什么办法可以使它成为'非空' –

+0

对于使用Main2Activity.myDb!= null部分真的非常必要吗?从我的角度来说,数据库处理部分应该在其他一些处理所有数据库事物的类中,不要使用活动类来完成所有逻辑事务,听说过MVC模式?这是MVC的完美情况。 – Infamous

+0

你可以使用静态块,但我真的不赞成这个选项, – Infamous

相关问题