1.虽然Android公司提供的SQLiteOpenHelper很强大 但是呢 毕竟还是得熟悉SQL语句 而且操作起来并没有面向对象的思想 greenDAO做了又一轮的封装 加上了面向对象 让我们操作更加得心应手
2.举例子
DaoMaster.java
package com.example.staring.greenDAO_Demo; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; import de.greenrobot.dao.AbstractDaoMaster; import de.greenrobot.dao.identityscope.IdentityScopeType; import com.example.staring.greenDAO_Demo.NoteDao; import com.example.staring.greenDAO_Demo.CustomerDao; import com.example.staring.greenDAO_Demo.OrderDao; // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. /** * Master of DAO (schema version 1000): knows all DAOs. * * 这个是DAO的祖宗 负责创建各种DAO */ public class DaoMaster extends AbstractDaoMaster { public static final int SCHEMA_VERSION = 1000; /** Creates underlying database table using DAOs. */ public static void createAllTables(SQLiteDatabase db, boolean ifNotExists) { NoteDao.createTable(db, ifNotExists); CustomerDao.createTable(db, ifNotExists); OrderDao.createTable(db, ifNotExists); } /** Drops underlying database table using DAOs. */ public static void dropAllTables(SQLiteDatabase db, boolean ifExists) { NoteDao.dropTable(db, ifExists); CustomerDao.dropTable(db, ifExists); OrderDao.dropTable(db, ifExists); } public static abstract class OpenHelper extends SQLiteOpenHelper { public OpenHelper(Context context, String name, CursorFactory factory) { super(context, name, factory, SCHEMA_VERSION); } @Override public void onCreate(SQLiteDatabase db) { Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION); createAllTables(db, false); } } /** WARNING: Drops all table on Upgrade! Use only during development. */ public static class DevOpenHelper extends OpenHelper { public DevOpenHelper(Context context, String name, CursorFactory factory) { super(context, name, factory); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables"); dropAllTables(db, true); onCreate(db); } } public DaoMaster(SQLiteDatabase db) { super(db, SCHEMA_VERSION); registerDaoClass(NoteDao.class); registerDaoClass(CustomerDao.class); registerDaoClass(OrderDao.class); } public DaoSession newSession() { return new DaoSession(db, IdentityScopeType.Session, daoConfigMap); } public DaoSession newSession(IdentityScopeType type) { return new DaoSession(db, type, daoConfigMap); } }
DaoSession.java
package com.example.staring.greenDAO_Demo; import android.database.sqlite.SQLiteDatabase; import java.util.Map; import de.greenrobot.dao.AbstractDao; import de.greenrobot.dao.AbstractDaoSession; import de.greenrobot.dao.identityscope.IdentityScopeType; import de.greenrobot.dao.internal.DaoConfig; import com.example.staring.greenDAO_Demo.Note; import com.example.staring.greenDAO_Demo.Customer; import com.example.staring.greenDAO_Demo.Order; import com.example.staring.greenDAO_Demo.NoteDao; import com.example.staring.greenDAO_Demo.CustomerDao; import com.example.staring.greenDAO_Demo.OrderDao; // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. /** * {@inheritDoc} * * @see AbstractDaoSession */ public class DaoSession extends AbstractDaoSession { private final DaoConfig noteDaoConfig; private final DaoConfig customerDaoConfig; private final DaoConfig orderDaoConfig; private final NoteDao noteDao; private final CustomerDao customerDao; private final OrderDao orderDao; public DaoSession(SQLiteDatabase db, IdentityScopeType type, Map<Class<? extends AbstractDao<?, ?>>, DaoConfig> daoConfigMap) { super(db); noteDaoConfig = daoConfigMap.get(NoteDao.class).clone(); noteDaoConfig.initIdentityScope(type); customerDaoConfig = daoConfigMap.get(CustomerDao.class).clone(); customerDaoConfig.initIdentityScope(type); orderDaoConfig = daoConfigMap.get(OrderDao.class).clone(); orderDaoConfig.initIdentityScope(type); noteDao = new NoteDao(noteDaoConfig, this); customerDao = new CustomerDao(customerDaoConfig, this); orderDao = new OrderDao(orderDaoConfig, this); registerDao(Note.class, noteDao); registerDao(Customer.class, customerDao); registerDao(Order.class, orderDao); } public void clear() { noteDaoConfig.getIdentityScope().clear(); customerDaoConfig.getIdentityScope().clear(); orderDaoConfig.getIdentityScope().clear(); } public NoteDao getNoteDao() { return noteDao; } public CustomerDao getCustomerDao() { return customerDao; } public OrderDao getOrderDao() { return orderDao; } }Note.java
package com.example.staring.greenDAO_Demo; // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. Enable "keep" sections if you want to edit. /** * Entity mapped to table "NOTE". */ public class Note { private Long id; /** Not-null value. */ private String text; private String comment; private java.util.Date date; public Note() { } public Note(Long id) { this.id = id; } public Note(Long id, String text, String comment, java.util.Date date) { this.id = id; this.text = text; this.comment = comment; this.date = date; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } /** Not-null value. */ public String getText() { return text; } /** Not-null value; ensure this value is available before it is saved to the database. */ public void setText(String text) { this.text = text; } public String getComment() { return comment; } public void setComment(String comment) { this.comment = comment; } public java.util.Date getDate() { return date; } public void setDate(java.util.Date date) { this.date = date; } }
NoteDAO.java
package com.example.staring.greenDAO_Demo; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteStatement; import de.greenrobot.dao.AbstractDao; import de.greenrobot.dao.Property; import de.greenrobot.dao.internal.DaoConfig; import com.example.staring.greenDAO_Demo.Note; // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. /** * DAO for table "NOTE". */ public class NoteDao extends AbstractDao<Note, Long> { public static final String TABLENAME = "NOTE"; /** * Properties of entity Note.<br/> * Can be used for QueryBuilder and for referencing column names. */ public static class Properties { //多少属性 public final static Property Id = new Property(0, Long.class, "id", true, "_id"); public final static Property Text = new Property(1, String.class, "text", false, "TEXT"); public final static Property Comment = new Property(2, String.class, "comment", false, "COMMENT"); public final static Property Date = new Property(3, java.util.Date.class, "date", false, "DATE"); }; //构造函数 public NoteDao(DaoConfig config) { super(config); } public NoteDao(DaoConfig config, DaoSession daoSession) { super(config, daoSession); } /** Creates the underlying database table. */ public static void createTable(SQLiteDatabase db, boolean ifNotExists) { //创建表 String constraint = ifNotExists? "IF NOT EXISTS ": ""; db.execSQL("CREATE TABLE " + constraint + "\"NOTE\" (" + // "\"_id\" INTEGER PRIMARY KEY ," + // 0: id "\"TEXT\" TEXT NOT NULL ," + // 1: text "\"COMMENT\" TEXT," + // 2: comment "\"DATE\" INTEGER);"); // 3: date } /** Drops the underlying database table. */ public static void dropTable(SQLiteDatabase db, boolean ifExists) { //删除表 String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"NOTE\""; db.execSQL(sql); } /** @inheritdoc */ @Override protected void bindValues(SQLiteStatement stmt, Note entity) { stmt.clearBindings(); Long id = entity.getId(); if (id != null) { stmt.bindLong(1, id); } stmt.bindString(2, entity.getText()); String comment = entity.getComment(); if (comment != null) { stmt.bindString(3, comment); } java.util.Date date = entity.getDate(); if (date != null) { stmt.bindLong(4, date.getTime()); } } /** @inheritdoc */ @Override public Long readKey(Cursor cursor, int offset) { return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0); } /** @inheritdoc */ @Override public Note readEntity(Cursor cursor, int offset) { Note entity = new Note( // cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id cursor.getString(offset + 1), // text cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2), // comment cursor.isNull(offset + 3) ? null : new java.util.Date(cursor.getLong(offset + 3)) // date ); return entity; } /** @inheritdoc */ @Override public void readEntity(Cursor cursor, Note entity, int offset) { entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0)); entity.setText(cursor.getString(offset + 1)); entity.setComment(cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2)); entity.setDate(cursor.isNull(offset + 3) ? null : new java.util.Date(cursor.getLong(offset + 3))); } /** @inheritdoc */ @Override protected Long updateKeyAfterInsert(Note entity, long rowId) { entity.setId(rowId); return rowId; } /** @inheritdoc */ @Override public Long getKey(Note entity) { if(entity != null) { return entity.getId(); } else { return null; } } /** @inheritdoc */ @Override protected boolean isEntityUpdateable() { return true; } }
NoteMainActivity.java
/* * Copyright (C) 2011 Markus Junginger, greenrobot (http://greenrobot.de) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.staring.greenDAO_Demo; import java.text.DateFormat; import java.util.Date; import android.app.ListActivity; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.inputmethod.EditorInfo; import android.widget.EditText; import android.widget.ListView; import android.widget.SimpleCursorAdapter; import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; import com.example.staring.R; public class NoteActivity extends ListActivity { private SQLiteDatabase db; private EditText editText; private DaoMaster daoMaster; private DaoSession daoSession; private NoteDao noteDao; private Cursor cursor; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes-db", null); db = helper.getWritableDatabase(); daoMaster = new DaoMaster(db); daoSession = daoMaster.newSession(); noteDao = daoSession.getNoteDao(); String textColumn = NoteDao.Properties.Text.columnName; String orderBy = textColumn + " COLLATE LOCALIZED ASC"; cursor = db.query(noteDao.getTablename(), noteDao.getAllColumns(), null, null, null, null, orderBy); String[] from = { textColumn, NoteDao.Properties.Comment.columnName }; int[] to = { android.R.id.text1, android.R.id.text2 }; //绑定数据源 SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, cursor, from, to); setListAdapter(adapter); editText = (EditText) findViewById(R.id.editTextNote); addUiListeners(); } protected void addUiListeners() { editText.setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { //监听键盘的enter健 如果按下 就执行addNote if (actionId == EditorInfo.IME_ACTION_DONE) { addNote(); return true; } return false; } }); final View button = findViewById(R.id.buttonAdd); button.setEnabled(false); editText.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { //Text长度不为0 按钮可以操作 就是不可以插入空值 如果我插入呢?? boolean enable = s.length() != 0; button.setEnabled(enable); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { } }); } public void onMyButtonClick(View view) { addNote(); } private void addNote() { String noteText = editText.getText().toString(); editText.setText(""); final DateFormat df = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM); String comment = "Added on " + df.format(new Date()); //这里构建一个note Note note = new Note(null, noteText, comment, new Date()); //这里把note添加进入 noteDao.insert(note); Log.d("DaoExample", "Inserted new note, ID: " + note.getId()); cursor.requery(); } @Override protected void onListItemClick(ListView l, View v, int position, long id) { //点击列表项删除 noteDao.deleteByKey(id); Log.d("DaoExample", "Deleted note, ID: " + id); cursor.requery(); } }