300x250

이 포스팅은 

아래 책의 일부 내용을 그대로 옴겨 적었습니다.

SQL 코딩의 기술 Effective SQL

 

SQL 코딩의 기술

SQL은 대부분의 데이터베이스 시스템과 소통하는 데 사용되는 표준 언어다. 이 책에서는 대표적인 DBMS인 오라클, SQL Server, MySQL, PostgreSQL, 액세스에서 SQL을 사용하는 방법을 비교해 보여준다. 또한

book.naver.com

 

 

Best Way 1 모든 테이블에 기본키가 있는지 확인


  • 모든 테이블에는 하나 또는 일련의 컬럼으로 구성된 기본키가 있어야한다.
  • 키가 아닌 컬럼에 중복값이 들어갈까 봐 걱정이 된다면 해당 컬럼에 유일 인덱스를 정의해 무결성을 확보할 수 있다.
  • 형태가 가능한 간단하고 값을 갱신할 필요가 없는 컬럼을 키로 사용한다.

 

 

Best Way 2. 중복으로 저장된 데이터 항목을 제거하자


  • 데이터베이스 정규화의 목표는 중복 데이터를 제거해 데이터를 처리할 때 사용되는 자원을 최소화하는 것이다.
  • 중복 데이터를 제거하면 비정상적인 삽입, 갱신, 삭제를 막을 수 있다.
  • 중복 데이터를 제거하면 일관성 없는 데이터 발생을 최소화할 수 있다.

 

* 참고문헌

설계 관련

  • <가장 쉬운 데이터베이스 설계책 : 적절한 데이터베이스 디자인을 위한 지침서 >  Database Design for MereMortalsz> 
  • <Handbook of Relational Database Design >

 

Best Way 3. 반복 그룹을 제거하자 


  • 데이터 베이스 정규화 목표는 데이터의 반복 그룹을 제거하고 스키마 변경을 최소화하는 것이다.
  • 데이터의 반복 그룹을 제거하면 이덱싱을 사용해 데이터 중복을 방지할 수 있고 쿼리도 간소화할 수 있다.
  • 데이터의 반복 그룹을 제거하면 테이블 설계가 더 유연해진다. 새로운 그룹을 추가할 때 테이블 설계를 바꿔서 새 컬럼을 추가하는 것이 아니라 단순히 또 다른 로우만 추가하면 되기 때문이다.

 

Best Way 4. 컬럼당 하나의 특성만 저장하자


  • 올바른 테이블 설계는 개별 특성을 자체 컬럼에 할당한다. 한 컬럼에 여러 특성이 포함되어 있으면 검색이나 그루핑 작업이 가능하다고 해도 어렵기 때문이다.
  • 일부 애플리케이션에서는 주소나 전화번호 같은 컬럼의 데이터 일부를 걸러 내려면 최소 소준의 데이터 조각으로 분할해야 한다.
  • 보고서나 목록을 뽑으려고 특성들을 재결합 때는 SQL의 문자열 연결 기능을 사용한다.

 

 

Best Way 5. 왜 계산 데이터를 저장하면 좋지 않은지 이해하자


  • 많은 시스템에서 테이블을 정의할 때 계산 컬럼을 정의할 수 있지만 성능을 고려해야한다. 특히 *비결정적 표현식이나 함수를 사용할 때는 더욱 그렇다.
  • 트러기를 사용해 계산 컬럼을 일반 컬럼처럼 정의할 수 있지만 작성해야 할 코드가 복잡하다.
  • 계산 컬럼은 데이터베이스 시스템에 추가적인 부하를 일으키므로 계산 컬럼으로 얻는 혜택이 부하를 일으키는 비용보다 클 때만 사용한다.
  • 대부분의 경우 저장 공간이 증가하고 데이터 갱신이 느린 대신 일부 혜택을 보려고 계산 컬럼에 인덱스를 만들고 싶을 것이다.
  • 인덱스 적용이 어려울때는 테이블에 계산결과를 저장해 놓는 방법 대신 뷰를 이용해 수행할 계산을 정의하는 방법을 종종 사용한다.

 

비결정적함수 ( Nondeterministic )

특정 값 집합이 입력되더라도 매번 다른 값을 반환할 수도 있다.

GETDATE() 함수와 같이 실핼할 때마다 매번 다른 값을 반환.

 

Best Way 6. 참조 무결성을 보호하려면 외래키를 정의하자


  • 명시적으로 외래키를 만들면 부모 테이블에 없는 로우를 가리키는 자식 테이블 로우가 없음을 보장할 수 있으므로 관련된 테이빌 간에 데이터 무결성을 혹인하는 데 좋다.
  • 이미 데이터가있는 테이블에 FOREIGN KEY 제약 조건을 추가할 때 이 제약 조건을 위반하는 데이터가 있다면 제약조건을 생성하는 작업은 실패할 것이다.
  • 일부 시스템에서는 FOREIGN KEY 제약 조건을 정의하면 자동으로인덱스를 만들어 주므로 조인 성능이 향상될 수 있다. 다른 시스템은 FOREIGN KEY 제약 조건이 걸린 컬럼에서 수동으로 인덱스를 만들어야 한다. 일부시스템은 인덱스 없이도 옵티마이저가 해당 컬럼을 특별 취급해 더 나은 쿼리 실행 계획을 세우기도 한다.

 

Best Way 7. 테이블 간 관계를 명확히 하자.


  • 컬럼이 비슷한 테이블을 서로 병합해 관계를 간소화하는 것이 정말 타당한지 면밀히 검토한다.
  • 데이터 타입이 일치한다면 두 테이블에 있는 컬럼 간 조인을 생성할 수 있는데, 이 관계는 해당 컬럼이 같은 돔인에 있을때만 성립한다. 하지만 조인에 사용되는 두 컬럼의 데이터 타입은 동일한 것이 가장 좋다.
  • 데이터 모델에서 실제로 정형 데이터를 다루고 있는지 확인한다. 다루는 데이터가 반정현이라면 필요한 대응ㅇ책을 마련한다.
  • 일반적으로 데이터 모델의 목표를 며확히 식별하면, 주어진 설계의 가소화와 데이터 모델을 사용하는 애플리케이션의 설계에 기인한 복잡성이나 이상 동작을 정당화하는지 판단하는데 도움이 된다. 

Best Way 8. 제 3정규화로도 부족하다면 더 정규화하자 


  • 대부분의 데이터 모델에는 이미 더 높은 정규화가 적용되어 있을 가능성이 높다. 따라서 더 높은 정규화 형식을 명확히 위반하는지 면밀히 관찰해야 한다. 특히 복합키를 사용하거나 여러 다대다 관계에 참여하는 테이블일 때는 더욱 그렇다.
  • 한 엔티티에서 관계가 없는 두 속성으로 가능한 모든 조합을 해당 에니티에 열거해야 하는 특수한 경우에는 제 4정규화를 위반할 수 이다.
  • 제5정규화는 후보키가 모든 조인 의존성을 함축하는지 확인하는 것이다. 즉, 개별 요소에 근거해 후보키에 유효한 값이 무엇인지 제약할 수 있어야 한다는 말이다. 이것은 키가 복합키일 때만 발생한다.
  • 제 6정규화는 일반적으로 관계를 키가 아닌 속성 하나로만 죽이는 것이다. 따라서 테이블 개수가 급격히 늘어나지만 넒 허용 컬러을 정의할 필요가 없다 .
  • 무손실 분할 테스트는 해당 테이블이 더 높은 정규화 형식을 위반하는지 감지하는 효과적인 도구가 될 수 있다.

Best Way 9. 데이터 웨어하우스에는 역정규화를 사용하자


  • 중복으로 저장할 데이터와 그 이유를 정한다.
  • 데이터를 일치된 상태로 유지할 계획을 세운다.
  • 역정규화된 필드를 사용하도록 쿼리를 리팩토링한다. 
반응형
300x250

이 포스팅은

developer.android.com/guide/topics/ui/declaring-layout?hl=ko

 

레이아웃  |  Android 개발자  |  Android Developers

레이아웃은 활동 또는 앱 위젯의 UI와 같은 사용자 인터페이스의 시각적 구조를 정의합니다. 두 가지 방법으로 레이아웃을 선언할 수 있습니다. Android 프레임워크를 통해 이 두 가지 메서드의 하

developer.android.com

안드로이드 디벨로퍼 공식 홈페이지 문서를 읽고 요약한 글입니다.

 

이전글


 https://ckstmsla.tistory.com/entry/사용자-인터페이스-레이아웃-View-ViewGroup-속성-위치-크기-여백-및-패딩

 

사용자 인터페이스 - 레이아웃[ View & ViewGroup 속성, 위치, 크기, 여백 및 패딩 ]

이 포스팅은 developer.android.com/guide/topics/ui/declaring-layout?hl=ko 레이아웃  | Android 개발자  | Android Developers 레이아웃은 활동 또는 앱 위젯의 UI와 같은 사용자 인터페이스의 시각적 구조를..

ckstmsla.tistory.com

 

 

일반 레이아웃


- ViewGroup 클래스의 각 서브클래스는 각기 고유한 방식으로 자신 안에 중첩된 뷰를 표시

- 레이아웃 계층 구조를 가능한 얕게 유지하도록 해야함, 중첩된 레이아웃이 적을수록 레이아웃이 더 빠르게 그려짐.
( 가로로 넓은 뷰 계층 구조가 세로로 깊은 뷰 계층 구조보다 나음 ). 

 

[ 선형 레이아웃 / LinearLayout ]

- 여러 하위 요소를 하나의 가로방향 또는 세로 방향 행으로 정리하는 레이아웃.

- 이 레이아웃은 창의 길이가 화면 길이를 웃도는 경우 스크롤바를 생성 

 

[ 상대적 레이아웃 / RelativeLayout ] 

- 여러 하위 객체의 위치를 서로 상대적으로 나타내거나 ( 하위 객체 A가 하위 객체 B의 왼쪽 ),

상위 요소와 상대적으로 나타낼 수 있도록 해줌 ( 상위 요소의 맨 위에 맞춰 정렬 ). 

[ 웹 보기 / WebView ] 

-  웹 페이지 표시 

 

[ 어댑터로 레이아웃 빌드 ]

- 레이아웃의 콘텐츠가 동적이거나 미리 정의되지 않은 경우,  AdapterView의 서브클래스가 되는 레이아웃을 사용하여 런타임에 뷰로 레이아웃을 채울 수 있다.

- AdapterView 클래스의 서브클래스는 Adapter를 사용하여 자신의 레이아웃에 데이터를 바인딩.

- Adapter :  데이터 소스와 AdapterView 레이아웃 사이의 중개자 역할을 함.

- Adapter가 데이터를 검색하여 ( 배열 or 데이터베이스 쿼리와 같은 Source로 부터 ) 각 항 목을 뷰로 변환해서 AdapterView 레이아웃에 추가될 수 있도록 함.

Flow between adapterView and dataSource

예)  어댑터로 지원되는 일반적인 레이아웃의  

  • 1차원 목록 보기 / LinearLayoutManager
    > 스크롤 단일 열 목록 표시
  • 2차원 격자 보기 / GridLayoutManager
    > 열과 행의 스크롤 그리드 표시
  • 스피너 / Spinner

 

[ 데이터로 어댑터 뷰 채우기 ] 

- ListView 또는 GridView와 같은 AdapterView를 채우려면 AdapterView인스턴스를 Adapter에 바인딩 하면 됨.

- 외부 소스로부터 데이터를 검색하여 각 데이터 항목을 나타내는 View를 생성 

- Adapter의 서브클래스를 여러개 제공, 여러 가지 종류의 데이터를 검색하고 AdapterView의 뷰를 빌드하는데 유용

예 ) 가장 일반적인 어댑터 

  • ArrayAdapter  :
    - 데이터 소스가 배열인 경우에 사용
    - ArrayAdapter가 각 항목에서 toString()을 호출하고 그 콘텐츠를 TextView에 배치함으로써 각 배열 항목의 뷰를 생성
    - TextView가 아닌 뷰를 생성하고자 하는 경우, ArrayAdapter클래스를 확장하고 getView()를 재정의하여 원하는 뷰 유형을 반환
/* 
Param1 : Context
Param2 : 배열에 있는 각 문자열의 TextView가 들어 있는 레이아웃
Param3 : 문자열 배열
*/
val adapter = ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myStringArray)

// ListView에서 setAdapter()를 호출하여 adapter 지정
val listView: ListView = findViewById(R.id.listview)
listView.adapter = adapter

 

  • SimpleCursorAdapter
    - 데이터 소스가 Cursor 인 경우에 사용
    - SimpleCursorAdapter를 사용하는 경우, Cursor에 있는 각행에 사용할 레이아웃을 지정해야 함.
    - Cursor의 어느 열이 레이아웃의 어느 뷰에 삽입되어야 할지도 지정해야함.


//SimpleCursorAdapter를 인스턴스화하는 경우, 
//각 결과에 사용할 레이아웃, 결과가 들어 있는 Cursor 및 다음 두 배열을 전달.
val fromColumns = arrayOf(ContactsContract.Data.DISPLAY_NAME,
                          ContactsContract.CommonDataKinds.Phone.NUMBER)
val toViews = intArrayOf(R.id.display_name, R.id.phone_number)

//SimpleCursorAdapter가 Cursor에 있는 각 행에 관한 뷰를 하나씩 생성.
// 상응하는 toViews 뷰 안에 각 fromColumns항목을 삽입하여 제공된 레이아웃 사용
val adapter = SimpleCursorAdapter(this,
        R.layout.person_name_and_number, cursor, fromColumns, toViews, 0)
val listView = getListView()
listView.adapter = adapter

 

- 앱 수명이 남아 있는 동안 어댑터가 읽는 기본 데이터를 변경하는 경우,
notifyDataSetChanged() 를 호출해야 함. 연결된 뷰에 데이터가 변경되었으며 새로 고침해야 함을 알림  

[ 클릭 이벤트 처리 ]

- AdapterView에 있는 각 항목에서의 클릭 이벤트에 응답하려면
AdapterView.OnItemClickListener인터페이스를 구현 

 

반응형
300x250

이 포스팅은

developer.android.com/guide/topics/ui/declaring-layout?hl=ko

 

레이아웃  |  Android 개발자  |  Android Developers

레이아웃은 활동 또는 앱 위젯의 UI와 같은 사용자 인터페이스의 시각적 구조를 정의합니다. 두 가지 방법으로 레이아웃을 선언할 수 있습니다. Android 프레임워크를 통해 이 두 가지 메서드의 하

developer.android.com

안드로이드 디벨로퍼 공식 홈페이지 문서를 읽고 요약한 글입니다.

 

이전글



https://ckstmsla.tistory.com/entry/사용자-인터페이스-레이아웃-View-ViewGroup-구조-XML

 

사용자 인터페이스 - 레이아웃[ View, ViewGroup 구조, XML ]

이 포스팅은 developer.android.com/guide/topics/ui/declaring-layout?hl=ko 안드로이드 디벨로퍼 공식 홈페이지 문서를 읽고 요약한 글입니다. 레이아웃 - 앱에서 사용자 인터페이스 위한 구조 - 모든 요소는 Vi..

ckstmsla.tistory.com

 

속성


- 모든 View와 ViewGroup 객체는 고유한 여러 가지 XML 속성을 지원

- 어떤 속성은 특정 View 객체에만 적용 ( 예 : TextView 속성 textSize, View 객체에 의해 상속받은 것 ) 

- 어떤 속성은 루트 View 클래스에서 상속되기 때문에 ( 예  : id 속성 ) 모든 View 객체에 공통적으로 적용

- 기타 속성은 'LayoutParam [ 레이아웃 매개변수] ' 로 간주됨,
이 매개변수는 View 객체의 특정 레이아웃 방향을 설명하는 속성으로 이 객체의 상위 ViewGroup 객체가 정의

 

[ ID ]

- View 객체는 트리 내에서 뷰를 고유하게 식별할 수 있는 정수 ID가 연결

- 일반적으로 id속성에서 문자열로 할당, 컴파일 할때 정수로 참조됨.

- 모든 View 객체에 공통적인 XML 속성 ( View 클래스에서 정의 됨 ).  

android:id="@id/tv"

-앳 기호  '@' :  XML 파서가 ID문자열의 나머지를 파싱하고 확장하여 ID리소스로 식별해야 한다는 것을 나타냄.

- 더하기 기호 ' + ' : 이것이 새 리소스 이름이며 리소스에 추가해야 한다는 뜻

- 이외에 Android 프레임워크는 다른 ID 리소스도 많이 제공.

- Android 리소스 ID 를 참조할 때 아래와 같이 android 패키지 네임 스페이스를 반드시 추가

android:id="@android:id/empty"

 - android 패키지 네임스페이가 들어가면 로컬 리소스 클래스가 아닌 android.R 리소스 클래스에서 ID 참조

 

[ 뷰 생성, 앱에서 참조하는 일반적인 패턴 ]

1. 레이아웃 파일에서 뷰/위젯 정의후 고유 ID 할당

<Button android:id="@+id/my_button"
	...
 />

 

2. 뷰 객체의 인스턴스를 생성 후, 이를 레이아웃에서 캡쳐

val myButton : Button = findviewById(R.id.my_button)

-> Android Studi 3.6 이상에서 findViewByID() 호출을 " View Binding " 기능으로 대체할 수 있음.

-> 뷰와 상호작용하는 코드에 관해 컴파일 시간, 유형 안정성 제공 

 

- RelativeLayout을 생성할 때 View 객체에서 ID를 정의하는 것이 중요

RelativeLayout에서는 형제 뷰 ( 동등 계층 )가 또 다른 형제 뷰를 기준으로 자신의 레이아웃을 정의할 수 있음. 이를 고유 ID로 참조 

- ID는 트리 전체를 통틀어 고유할 필요는 없지만, 트리에서 검색하고 있는 부분 내에서는 고유해야 함.

예) RelativeLayout 내 " Button View[ id = button2 ] 는 Button View [ id = button1 ]와 Button View [ id = button2 ] 사이에 위치 

-> Button View[ id = button2 ]에 각 layout_below, layout_above 속성에 고유 id를 명시

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
	...
	<Button id="@+id/button1"
    	...>
     
	<Button id="@+id/button2"
        android:layout_below="@+id/buttn1"
        android:layout_above="@+id/button3"
        .../>
     
	<Button id="@+id/button3"
    	.../>
    
    ...
/>

 

[ 레이아웃 매개변수 ] 

- XML 레이아웃 속성이 View가 상주하는 ViewGroup에 적절한 View 레이아웃 매개변수를 정의 

- 모든 ViewGroup 클래스가 중첩된 클래스를 하나씩 구현, 이것이 ViewGroup.LayoutParams를 확장, 이 서브 클래스에는 각 하위 뷰의 크기와 위치를 뷰 그룹에 적절한 방식으로 정의하는 속성 유형이 들어 있음.

- 상위 뷰 그룹이 각 하위 뷰의 레이아웃 매개 변수를 정의 ( 하위 뷰 그룹 포함 ). 

-> 최상위 ViewGroup인 LinearLayout이 하위 뷰, 뷰 그룹인 ConstraintLayout 와 View 2개의 매개 변수를 정의

각 뷰와 연결된 레이아웃 매개변수가 있는 뷰 계층 구조 시각화

각 뷰와 연결된 레이아웃 매개변수가 있는 뷰 계층 구조 시각화

- 모든 LayoutParams서브 클래스에는 설정 값에 관한 각기 자신만의 구문이 있음.

- 각 하위 요소는 자신의 상위 요소에 적합한 LayoutParams를 정의 해야함

- 모든 View Group 에는 width, height가 포함 ( layout_width, layout_height )
각 뷰는 이들을 반드시 정의해야 함 

- LayoutParams 선택사항 : 여백, 테두리 속성

- width와 height는 아래 3가지와 같은 상대적인 측정값을 사용하는 것이 좋음.

  • wrap_content : 콘텐츠에 필요한 치수대로 알아서 크기 조절
  • match_parent : 상위 뷰 그룹이 허용하는 한 최대한 커지도록 함
  • dp : 밀도 독립형 픽셀 단위

 이러면 앱이 다양한 기기 화면 크기에 적절하게. 표시.

 

[ 레이아웃. 위치 ]

- 뷰의 도형은 직사각형

- 뷰에는 위치가 있음. left 및  top 좌표 그리고 width, height를 나타내는 형식으로 표현

- 위치와 치수의 단위는 픽셀

- 뷰의 위치 검색 : getLeft () 및 getTop() 메서드를 호출

  • getLeft () : 뷰를 나타내는 직사각형의 왼쪽, X 좌표 반환
  • getTop () : 뷰를 나타내는 직사각형의 상단, Y 좌표를 반환

둘다 뷰의 상위 요소에 상대적인 뷰의 위치를 반환 
예 ) getLeft() 가 20인 경우, 해당 뷰가 직접적인 상위 요소의 왼쪽 가장자리에서 오른쪽으로 20px 떨어진 곳에 있다는 뜻  

*아래 그림은 이해를 돕기 위해 작성하였으며 개념이 정확히 일치하지 않을수도 있음

getLeft ()

 

 

- 그외 getRight(), getBottom() 으로 직사각형의 오른쪽 하단 가장자리를 나타냄

-> getRight () : getLeft() + getWidth() 계산된 px 값 반환 

getRight()

 

 

[ 크기 ]

- 뷰의 크기는 너비와 높이로 표현, 하나의 뷰는 두 쌍의 너비 및 높이 값을 소유

  • 첫번째 쌍 : 측정된 너비 및 측정된 높이
    > 이 치수는 뷰가 상위 요소 내에서 얼마나 커지고자 하는지 정의 
    > getMeasureWidth(), getMeseuredHeight () 

  • 두번째 쌍 : 단순히 너비 및 높이 라고 일 컬음
    > 그리기 ( Draw ) 너비 및 그리 높이로 불려지기도 함
    > 이 치수는 Drawing 시점? 및 레이아웃? 후에 뷰가 화면에 표시되는 실제 크기 정의
    > 측정된 너비 및 높이와 달라도 되지만 꼭 달라야 하는 것으 ㄴ아님.
    > getWidth(), getHeight () 

[ 패딩 ] 

- 뷰의 치수를 측정하기 위해 뷰는 자신의 패딩을 감안

- 패딩은 뷰 왼쪽, 상단, 오른쪽 및 하단부분에 관해 픽셀로 표시

- 패딩은 정해진 픽셀 수를 사용하여 뷰의 콘텐츠를 오프셋하는데 쓰일 수도 있음.

예) 왼쪽 패딩 2로 설정하면, 뷰의 콘텐츠를 왼쪽 가장 자리에서 오른쪽으로 2픽셀 밀어냄.

- setPadding ( int, int, int, int ) 
- getPaddingLeft (), getPaddingTop (), getPaddingRIght (), getPaddingBottom () 

[ 여백 ]

-뷰는 패딩을 정의할 수 있지만, 여백 지원은 제공하지 않음.

- 뷰 그룹이 그와 같은 지원을 제공 
-> ViewGroup 및 ViewGroup.MarginLayoutParmas

 

 

반응형
300x250

이 포스팅은

developer.android.com/guide/topics/ui/declaring-layout?hl=ko

안드로이드 디벨로퍼 공식 홈페이지 문서를 읽고 요약한 글입니다.

 

레이아웃


- 앱에서 사용자 인터페이스 위한 구조 

- 모든 요소는 View와 ViewGroup 객체의 계층 구조를 사용하여 빌드

- View는 일반적으로 사용자가 보고 상호작용할 수있는 것을 그림.

-ViewGroup은 View및 기타 ViewGroup 객체의 레이아웃 구조를 정의하는 보이지 않는 컨테이너

 

UI 레이아웃을 정의하는 뷰 계층 구조 예

 

View 객체


- 일반적으로 위젯 이라고 함

- Button, TextView와 같은 여러 시브클래스 중 하나

 

ViewGroup 객체


- 일반적으로 레이아웃 이라고 함

- LinearLayout 또는 ConstraintLayout과 같은 다양한 레이아웃 구조를 제공하는 여러 유형 중 하나 

 

 

레이아웃을 선언하는 방법


UI 요소를 XML로 선언

- Android는 위젯, 레이아웃과 같이 View클래스와 서브 클래스에 상응하는 간단한 XML어휘를 제공.

- Android Studio의 Layout Editor를 사용하여 드래그 앤 드롭 인터페이스로 XML 레이아웃을 빌드 할 수 있음.

- 동작을 제어하는 코드로부터 앱 표현을 분리 

- 다양한 화면 크기와 방향에 여러가지 레이아웃을 쉽게 제공.

 

 

런타임에 레이아웃 요소 인스턴스 화

- 앱은 프로그래매틱 방식으로 View 및 ViewGroup 객체를 만들고 그 속성을 조작할 수 있음.

 

Android 프레임워크는 두가지 방법을 조합하여 사용가능

> 앱의 기본 레이아웃을 XML에서 선언.

> 런타임에 레이아웃을 수정.

 

XML 쓰기


- 각 레이아웃 파일에는 반드시 딱 하나의 루트 요소만 있어야 하며, View 또는 ViewGroup 객체여야 함.

- 루트 요소를 정의한 후, 더 많은 레이아웃 객체 또는 위젯을 하위 요소로 추가하여 계층적으로 레이아웃을 정의하는 뷰 계층 구조를 빌드

Example ) Vertical 방향 LinearLayout을 사용, TextView, Button을 보유하는 XML

- res/layout디렉터리에 .xml확장자로 저장

 

XML 리소스 로드


- 각 XML레이아웃 파일이 View리소스 안에 컴파일 됨

- Activity.onCreate() 콜백 구현에서 앱코드로부터 레이아웃 리소스를 로드해야 함.

> setContentView() 호출, R.layout.layout_file_name의 형태로 레이아웃 리소스 참조로 전달.

 

반응형
300x250

2021.05. 30

- 2021년 4월 29일 Apple Sillicon에 최적화 된 Android Studio 프리뷰 버전 출시
- 아래 글에 설치 가이드

https://ckstmsla.tistory.com/entry/M1-Mac-Apple-Silicon-arm64-Preview-버전

 

 

 

 


*Preview 배포 단계*임

알려진 이슈 및 사용법


github.com/google/android-emulator-m1-preview

 

google/android-emulator-m1-preview

Contribute to google/android-emulator-m1-preview development by creating an account on GitHub.

github.com




실행


위 메시지가 팝업되고 에뮬레이터가 실행된다.



프리뷰 단계라 큰 기대하지 않고
Build and Run 되는것에 일단 만족.

반응형
300x250

" GROUP BY표현식이 아닙니다. "

SELECT절에 그룹함수를 제외한 컬럼들은

GROUP BY 절과 일치해야함. 오라클 한정

 

예 ) 올바른 GROUP BY 표현식이 아닌 경우

SELECT KEY1, KEY2, COUNT(*)
FROM TABLE
GROUP BY KEY1

 

아래와 같이 SELECT, GROUP BY절에 컬럼들이 일치해야한다.

SELECT KEY1, KEY2, COUNT(*)
FROM TABLE
GROUP BY KEY1, KEY2

SELECT KEY1, COUNT(*)
FROM TABLE
GROUP BY KEY1
반응형

+ Recent posts