开发者社区> 问答> 正文

有关于AndroidSQLite的问题

小弟在学习的时候,遇到了一些困难,求大神解答!
这是我遇到的困难:
screenshot
我写的代码:
其中一个是AddDAO接口:

 package com.AA.database;

import android.content.ContentValues;
 import android.content.Context;
 import android.database.Cursor;
 import android.database.sqlite.SQLiteDatabase;

public class AddDAO {
 SQLiteDatabase db;
public AddDAO(Context c){
    db = new DBHelper(c).getWritableDatabase();
}

public void add(ContentValues cv) {
    db.insert(DBConstants2.add.TABLE_NAME, null, cv);
}

public void update(long id, ContentValues cv) {
    db.update(DBConstants2.add.TABLE_NAME, cv, "_id = ?", new String[] { String.valueOf(id) });
}

public void del(long id) {
    db.delete(DBConstants2.add.TABLE_NAME, "_id = ?", new String[] { String.valueOf(id) });
}

public Cursor queryAll() {
    return db.rawQuery("select * from add", null);
}

public Cursor queryAllByType(int type) {
    return db.rawQuery("select * from add where type = ?", new String[] { String.valueOf(type) });
}

public Cursor queryAllDetail(String start, String end) {
    return db.rawQuery("select * from add where [date] >= ? and [date] <= ?", new String[] { start, end });
}

public Cursor queryForTypeAll(String start, String end, int type) {
    return db.rawQuery("select sum(time) from add where [date] >= ? and [date] <= ? and type =?",
            new String[] { start, end, String.valueOf(type) });
}

public Cursor queryAllDay(String date) {
    return db.rawQuery("select * from add where [date] = ? ", new String[] { date });
}

public Cursor queryAllDayByType(String date, int type) {
    return db.rawQuery("select * from add where [date] = ? and type = ?",
            new String[] { date, String.valueOf(type) });
}

public Cursor queryAllForKind(String start, String end, int type) {
    return db.rawQuery("select * from add where [date] >= ? and [date] <= ? and type =? group by kind",
            new String[] { start, end, String.valueOf(type) });
}

 }

还有一个是OtherdataDAO2:

 package com.AA.database;

import android.content.ContentValues;
 import android.content.Context;
 import android.database.Cursor;
 import android.database.sqlite.SQLiteDatabase;

public class OtherdataDAO2 {
 SQLiteDatabase db;
public OtherdataDAO2(Context c) {
    db = new DBHelper(c).getWritableDatabase();
}

public void add(ContentValues cv) {
    db.insert(DBConstants2.ActionList.TABLE_NAME, null, cv);
}

public void update(long id, ContentValues cv) {
    db.update(DBConstants2.ActionList.TABLE_NAME, cv, "_id = ?", new String[]{String.valueOf(id)});
}

public void del(long id) {
    db.delete(DBConstants2.ActionList.TABLE_NAME, "_id = ?", new String[]{String.valueOf(id)});
}

public Cursor queryAll(int type) {
    return db.rawQuery("select * from ActionList where type = ?", new String[]{String.valueOf(type)});
}

public Cursor queryById(long id) {
    return db.rawQuery("select * from ActionList where _id = ?", new String[]{String.valueOf(id)});
}

public String queryForFirst(int type) {
    Cursor cursor = db.rawQuery("select * from ActionList where type = ? limit 0,1", new String[]{String.valueOf(type)});
    if(cursor.moveToNext()) {
        return cursor.getString(cursor.getColumnIndex(DBConstants2.ActionList.NAME));
    }
    return "其他";
}

 }

然后RecordActivity2:
 package com.AA.record;

import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.Date;

import com.AA.database.ActionListDAO;
 import com.AA.database.AddDAO;
 import com.AA.database.DBConstants2;
 import com.AA.database.OtherdataDAO2;
 import com.AA.f1.R;
 import com.AA.otherdata.OtherdataListActivity2;

import android.annotation.SuppressLint;
 import android.app.Activity;
 import android.app.DatePickerDialog;
 import android.app.DatePickerDialog.OnDateSetListener;
 import android.content.ContentValues;
 import android.content.Intent;
 import android.os.Bundle;
 import android.view.View;
 import android.widget.DatePicker;
 import android.widget.EditText;
 import android.widget.TextView;
 import android.widget.Toast;

public class RecordActivity2 extends Activity {
TextView tv03,tv05,tv07,tv09,tv11,tv13;
EditText et01,et02;
ActionListDAO aldao;
AddDAO adao;
OtherdataDAO2 oddao2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_record);
    init();
    initData();
    }

//初始化函数
    private void init() {
        tv03 = (TextView) findViewById(R.id.tv03);//运动类型选项
        tv05 = (TextView) findViewById(R.id.tv05);//锻炼部位选项
        tv07 = (TextView) findViewById(R.id.tv07);//锻炼内容选项
        tv09= (TextView) findViewById(R.id.tv09);//项目次数选项
        tv11 = (TextView) findViewById(R.id.tv11);//力量级别选项
        tv13 = (TextView) findViewById(R.id.tv13);//锻炼日期选项
        et01 = (EditText) findViewById(R.id.et01);//锻炼时长
        et02 = (EditText) findViewById(R.id.et02);//备注栏
        adao=new AddDAO(this);//用于输入数据
        aldao=new ActionListDAO(this);//用于选择动作
        oddao2 = new OtherdataDAO2(this);//用于添加至明细
    }

@SuppressLint("SimpleDateFormat") 
private void initData() {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    tv09.setText(sdf.format(new Date()));
    tv03.setText(aldao.queryForFirst(DBConstants2.ActionList.TYPE_SportType));
    tv05.setText(aldao.queryForFirst(DBConstants2.ActionList.TYPE_FitnessPart));
    tv07.setText(aldao.queryForFirst(DBConstants2.ActionList.TYPE_FitnessContent));
    tv11.setText(aldao.queryForFirst(DBConstants2.ActionList.TYPE_StrengthLevel));
    tv13.setText(aldao.queryForFirst(DBConstants2.ActionList.TYPE_ProjectNumber));
}

public void toDate(View v) {
    Calendar c = Calendar.getInstance();
    DatePickerDialog dialog = new DatePickerDialog(this, new OnDateSetListener() {

        @Override
        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
            tv09.setText(year + "-" + (monthOfYear + 1) + "-" + dayOfMonth);
        }
    }, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH));
    dialog.show();
}

public void back(View v) {
    finish();
}

public void add(View v) {
    ContentValues cv = new ContentValues();
    cv.put(DBConstants2.add.TIME, et01.getText().toString());
    cv.put(DBConstants2.add.SportType, tv03.getText().toString());
    cv.put(DBConstants2.add.FitnessPart, tv05.getText().toString());
    cv.put(DBConstants2.add.FitnessContent, tv07.getText().toString());
    cv.put(DBConstants2.add.DATE, tv09.getText().toString());
    cv.put(DBConstants2.add.StrengthLevel, tv11.getText().toString());
    cv.put(DBConstants2.add.ProjectNumber, tv13.getText().toString());
    cv.put(DBConstants2.add.MARK, et02.getText().toString());
    //cv.put(DBConstants2.inout.MONEY, et01.getText().toString());
    //cv.put(DBConstants2.inout.KIND, tv03.getText().toString());
    //cv.put(DBConstants2.inout.ACCOUNT, tv05.getText().toString());
    //cv.put(DBConstants2.inout.SHOP, tv07.getText().toString());
    ///cv.put(DBConstants2.inout.DATE, tv09.getText().toString());
    //cv.put(DBConstants2.inout.MEMBER, tv11.getText().toString());
    //cv.put(DBConstants2.inout.PROJECT, tv13.getText().toString());
    //cv.put(DBConstants2.inout.MARK, et02.getText().toString());
    //cv.put(DBConstants.inout.TYPE, DBConstants.inout.TYPE_IN);
    adao.add(cv);
    Toast.makeText(this, "记录成功!!!", Toast.LENGTH_SHORT).show();
    finish();
}

//从Otherdatalist里获取动作列表

public void toOther(View v) {
    Intent i = new Intent(this, OtherdataListActivity2.class);
    i.putExtra("rs", true);
    int requestCode = 0;
    switch (v.getId()) {
    case R.id.tv03:
        requestCode = 3;
        i.putExtra("type", DBConstants2.ActionList.TYPE_SportType);
        break;
    case R.id.tv05:
        requestCode = 5;
        i.putExtra("type", DBConstants2.ActionList.TYPE_FitnessPart);
        break;
    case R.id.tv07:
        requestCode = 7;
        i.putExtra("type", DBConstants2.ActionList.TYPE_FitnessContent);
        break;
    case R.id.tv11:
        requestCode = 11;
        i.putExtra("type", DBConstants2.ActionList.TYPE_StrengthLevel);
        break;
    case R.id.tv13:
        requestCode = 13;
        i.putExtra("type", DBConstants2.ActionList.TYPE_ProjectNumber);
        break;
    }
    startActivityForResult(i, requestCode);
}

//进入OtherdataList里可以进行选择动作

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 3 && resultCode == RESULT_OK) {
        tv03.setText(data.getStringExtra("value"));
    }else if (requestCode == 5 &&resultCode == RESULT_OK){
        tv05.setText(data.getStringExtra("value"));
    }else if (requestCode == 7 && resultCode == RESULT_OK) {
        tv07.setText(data.getStringExtra("value"));
    } else if (requestCode == 11 && resultCode == RESULT_OK) {
        tv11.setText(data.getStringExtra("value"));
    } else if (requestCode == 13 && resultCode == RESULT_OK) {
        tv13.setText(data.getStringExtra("value"));
    }
}

 }

求大神帮忙解答下!谢谢

展开
收起
爵霸 2016-03-03 15:47:58 10908 0
1 条回答
写回答
取消 提交回答
  •   关于 SQLite 的优化,首先是能用SQL语句的,就不要单笔操作, Cursor 就更是能不用就不用。比如成批的 DELETE/UPDATE ,将条件组装到 SQL 语句,会比使用 CURSOR 一条条的查再删效率要高很多( 若干年前就曾使用存储过程代替单笔操作,将一次批量计算时间从一晚上缩到了一小时以内 )。其次是对操作的优化:对于 INSERT/UPDATE 操作较多时使用事务,如果SELECT操作较多时,使用索引。    结合现在的工作,发现针对操作的优化,下面 这篇文章 可以翻译出来归档。以下为正文:    SQLite 有一个简洁的SQL接口,且以低内存占用著称。现如今, SQLite 已经在 Android 及 iOS 开发中得到广泛的应用。本文主要讨论在 Android 应用如何优化 SQLite 的性能和资源占用。    1, 使用事务( Transaction )    在默认情况下每一个SQL语句都被包一个全新的事务内,比如执行一个如INSERT这样基本的数据库操作,就会放到一个新创建的事务中执行。一次只需要操作一次数据库操作时,让SQLite自己来进行事务管理当然是明智的。但如果一次有大量的操作要做时,比如循环调用INSERT添加时,这样就显得开销过大了,因为每一笔操作都要重新打开、写入,最后再关闭journal文件, 这个文件是临时用来保存数据操作的中间结果,详细内容看这里( 参考 )。   如果明确地在一系列SQL语句前后以 BEGIN TRANSACTION 及 END TRANSACTION 这样显示地使用事务就可以避免上面的情况。对于那些不会改变数据的操作,这样的方式也同样可以提速(好似数据库操作中单笔的操作效率将远低于批次操作,如果用SQL语句可以搞定的事,就不可使用Cursor进行操作)。    注明:除了发起事务外,你必须还要负责对事务的提交和回滚操作。    在Android应用开发中可以使用类似如下的方式使用 BEGIN TRANSACTION 及 END TRANSACTION :   db.beginTransaction(); try{  for(int i =0; i< LENGTH ; i++,sequenceNum++)  {  // execute SQL  }  db.setTransactionSuccessful();// marks a commit } finally{  db.endTransaction(); }    2. 使用索引    如果没有在数据库使用索引,当你在一个没有排序的数据表中使用映射查询(projection query)搜索时,无可避免的要执行一个全序列查找。这种情况通常并不是什么问题,每种数据库,包括SQLite都会为数据集执行索引来降低查找时间。    索引维护着一个表中某一列或某几列的顺序,这样就可以快速定位到一组值,而不用扫遍全表。所有的索引信息会被保存在一个独立的索引表中,所以会产生额外的空间占用,不过绝对物超所值,特别是当你会在数据库中进行大量的读及搜索操作时。    SQLite会自动为每一个UNIQUE栏位创建索引,包括主键(Primary Key)栏位,另外也可以通过CREATE INDEX进行显示地创建。    注:如果你的查询太复杂而无法使用所创建的索引,那你就要好好想想你数据库的结构了。   3. 在Where分支中使用限定符    如果以字串拼接出SQL语句的Where,莫不如使用SQLite的query操作带上'?'来编译查询。以下是它的好处:    a. 有利于SQLite缓存这些查询。    b. 可以避免达到SQLite缓存的上限。使用字串拼接Where的查询,每一个都被视为不同的查询,这就容易达到缓存的上限。    c. 可以避免非法的SQL注入。   
    

    “答案来源于网络,供您参考” 希望以上信息可以帮到您!

    2019-09-27 19:03:53
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载