ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

java-尝试从数据库获取数据时内存耗尽(android)

2019-11-20 12:00:41  阅读:148  来源: 互联网

标签:sqlite java android database


我正在尝试从数据库中获取一些信息.我是android的初学者.
我有一个名为“ Database”的数据库创建类,以及一个名为“ Database_Acesso”的数据库访问类.它们看起来像这样:

Database.java:
    软件包workshopee.ct.ufrn.br.ssmonitor;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class Database extends SQLiteOpenHelper{
    private static final int versao_db = 1;

    private static final String nome_db = "ssmonitor_db";

    private static final String table1 = "phone";

    private static final String id = "_id";
    private static final String longitude = "longitude";
    private static final String latitude = "latitude";
    private static final String forca_torres = "qtdtorres";
    private static final String forca_dbm = "dbm";
    private static final String mcc = "mcc";
    private static final String mnc = "mnc";
    private static final String phone_type = "phone_type";
    private static final String operadora = "operadora";
    private static final String network_type = "networkType";
    private static final String cid = "cid";
    private static final String lac = "lac";

    public Database(Context context) {
        super(context, nome_db, null, versao_db);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        String criarTabela = "CREATE TABLE " + table1 + "("
                + id + " INTEGER PRIMARY KEY AUTOINCREMENT," + longitude + " REAL,"
                + latitude + " REAL," + forca_torres + " INTEGER," + forca_dbm + " REAL," + mcc + " INTEGER,"
                + mnc + " INTEGER," + phone_type + " TEXT," + operadora + " TEXT," + network_type + " INTEGER," + cid + " INTEGER,"
                + lac + " INTEGER )";
        db.execSQL(criarTabela);

               }
    @Override
    public void onUpgrade(SQLiteDatabase db, int versao_ant, int versao_nv) {
        Log.w(Database.class.getName(),
                "Atualizando o banco de dados da versão " + versao_ant + " para "
                        + versao_nv + ", isso apagará os dados antigos.");
        db.execSQL("DROP TABLE IF EXISTS " + table1 + ";");
        onCreate(db);

    }

    public void clear (SQLiteDatabase db) {
        Log.w(Database.class.getName(),
                "Apagando informações salvas anteriormente.");
        db.execSQL("DROP TABLE IF EXISTS " + table1 + ";");
        onCreate(db);
    }

}

Database_Acesso.java:

package workshopee.ct.ufrn.br.ssmonitor;

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

import java.util.ArrayList;
import java.util.List;

public class Database_Acesso {
    private SQLiteDatabase db;

public Database_Acesso(Context context) {
    Database aux_db = new Database(context);
    db = aux_db.getWritableDatabase();
}
public void inserir_phone (Phone ph) {

    ContentValues valores = new ContentValues();
    valores.put("longitude",ph.getLongitude());
    valores.put("latitude", ph.getLatitude());
    valores.put("qtdtorres", ph.getTorres());
    valores.put("dbm", ph.getDbm());
    valores.put("mcc", ph.getMcc());
    valores.put("mnc", ph.getMnc());
    valores.put("phone_type", ph.getPhoneType());
    valores.put("operadora", ph.getOperadora());
    valores.put("cid",ph.getCid());
    valores.put("lac",ph.getLac());

    db.insert("phone", null, valores);
}


public List<Phone> buscar_phone () {
    List<Phone> lista = new ArrayList<Phone>();

    String[] colunas = new String[]{"_id", "longitude", "latitude", "qtdtorres", "dbm",
                        "mcc", "mnc", "phone_type", "operadora", "networkType", "cid", "lac"};

    Cursor cursor = db.query("phone", colunas, null, null, null, null,"_id ASC");
    if (cursor.getCount() > 0) {
        cursor.moveToFirst();
    }

   do {
       Phone p = new Phone();
       p.setId(cursor.getLong(0));
       p.setLongitude(cursor.getDouble(1));
       p.setLatitude(cursor.getDouble(2));
       p.setTorres(cursor.getInt(3));
       p.setDbm(cursor.getInt(4));
       p.setMcc(cursor.getInt(5));
       p.setMnc(cursor.getInt(6));
       p.setPhoneType(cursor.getString(7));
       p.setOperadora(cursor.getString(8));
       p.setNetWorkType(cursor.getString(9));
       p.setCid(cursor.getInt(10));
       p.setLac(cursor.getInt(11));
       lista.add(p);

   } while (!cursor.isLast());

    return lista;
  }

}

这是我的MainActivity插入数据的部分:

    database_acesso.inserir_phone(cell);

其中database_acesso是Database_acesso的实例,而cell是Phone的实例.

这就是我试图获取信息的方式:
     TextView list_text_view =(TextView)rootView.findViewById(R.id.list_text_view);
     清单清单= main.database_acesso.buscar_phone();
     list_text_view.append(“-” list.size());

我正在使用片段,因此“ main”是MainActivity上的一个实例.
当我尝试执行它时,出现以下错误:

java.lang.OutOfMemoryError: [memory exhausted]
        at dalvik.system.NativeStart.main(Native Method)

这是完整的堆栈跟踪.

有解决这个问题的想法吗?

谢谢.

解决方法:

您永远不会在do {…} while()循环中调用cursor.moveToNext(),因此您将连续创建新的Phone对象,直到用尽内存.

可以说,编写循环的一种更好的方法是:

Cursor cursor = db.query("phone", colunas, null, null, null, null,"_id ASC");

while (cursor.moveToNext())
{
    // Do stuff
}

…因为moveToNext()返回一个布尔值,指示它是否已经结束.它还节省了对getCount()的调用的开销.

标签:sqlite,java,android,database
来源: https://codeday.me/bug/20191120/2043975.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有